web-dev-qa-db-ja.com

カスタムオブジェクトのAndroid)でArrayAdapterを使用する方法

リストビューでカスタムオブジェクトのプロパティを使用するにはどうすればよいですか。文字列のリストを使用してArrayAdapterを実装すると、リストビューでは正常に表示されますが、カスタムオブジェクトのリストを使用すると、メモリアドレスが出力されるだけです。

私が今まで持っているコード:

ArrayList<CustomObject> allObjects = new ArrayList<>();

allObjects.add("title", "http://url.com"));


  ArrayAdapter<NewsObject> adapter = new ArrayAdapter<NewsObject>(this,
                Android.R.layout.simple_list_item_1, Android.R.id.text1, allNews);


        // Assign adapter to ListView
        listView.setAdapter(adapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Uri uri = Uri.parse( "http://www.google.com" );
                startActivity(new Intent(Intent.ACTION_VIEW, uri));
            }
        });

同様の質問があります ここ しかし、リストビューにタイトルを表示し、クリックしたときにURLを抽出する必要があるため、これは必要ありません。

13
Eduardo Dennis

ArrayAdapterは、toString()メソッドによって返される値を表示するため、目的の文字列を返すには、カスタムObjectクラスでこのメソッドをオーバーライドする必要があります。また、クリックイベントでそれを取得できるように、少なくともURLのgetterメソッドが必要になります。

_public class NewsObject {
    private String title;
    private String url;

    public NewsObject(String title, String url) {
        this.title = title;
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    @Override
    public String toString() {
        return title;
    }
    ...
}
_

onItemClick()メソッドでは、positionは、クリックされたリストアイテムに対応するカスタムオブジェクトのArrayList内のインデックスになります。 URLを取得して解析し、startActivity()を呼び出します。

_listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            NewsObject item = allNews.get(position);
            String url = item.getUrl();
            Uri uri = Uri.parse(url);
            startActivity(new Intent(Intent.ACTION_VIEW, uri));
        }
    });
_

カスタムクラスはNewsObjectであると想定していることに注意してください。これは、Adapterの例で使用されているものです。

25
Mike M.

カスタムクラスのメソッドを使用する場合は、custor ArrayAdapterクラスを実装する必要があります...これを作成するにはどうすればよいですか?

最初のステップ

プロジェクトを取得して、新しいクラスを作成します。次に、クラスをArrayAdapter<YourObject>{}で拡張し、必要な属性を属性内で宣言します...私の例:

public class Room_Adapter extends ArrayAdapter<Room_Object> {

//Declaration of Atributes
private ArrayList<Room_Object> Rooms_Array;
private final Activity context;
private final ListView lvBuinding;

このクラスのコンストラクターを宣言します。常にActivityとArrayListが必要であり、必要に応じて他のコンストラクター内に配置します...私の場合はリストビューが必要です...私の例:

public Room_Adapter(Activity context, ArrayList<Room_Object> Rooms_Array,ListView lvBuinding) {
    super(context, R.layout.room_layout, Rooms_Array);

    this.context = context;
    this.Rooms_Array = Rooms_Array;
    this.lvBuinding = lvBuinding;
}

スーパーメソッドには、アクティビティ、カスタムレイアウト(ある場合)、および配列が必要です。

番目

カスタム行レイアウトがある場合は、静的クラスを宣言するか、新しいクラスを作成します。私の例には静的クラスがあります:

public static class Room_View{

    //Declaration of Atributes
    TextView RoomName;
    ImageView RoomState;
    TextView NoTroubles;

    Button btnRoomRow;

    ImageButton btnShowRoomTasks;
    ImageButton btnAddTasks;

    RelativeLayout RowLayout;
}

4番目

メソッドgetViewをオーバーライドします。

@Override
public View getView(int position, View ConvertView, ViewGroup parent) {

    //Declaration of Variables
    Room_View rowView; //Custom static class with controls
    LayoutInflater inflator = context.getLayoutInflater();

    if (ConvertView == null) {
        rowView = new Room_View();
        ConvertView = inflator.inflate(R.layout.room_layout,null,true); //Inflate your view with your custom view.


        rowView.RoomName = (TextView) ConvertView.findViewById(R.id.txtvRoom);
        rowView.RoomState = (ImageView) ConvertView.findViewById(R.id.ivRoomState);
        rowView.NoTroubles = (TextView) ConvertView.findViewById(R.id.txtvNoTroubles);

        rowView.btnRoomRow = (Button) ConvertView.findViewById(R.id.btnRoomRow);

        rowView.btnAddTasks = (ImageButton) ConvertView.findViewById(R.id.btnAddTask);
        rowView.btnShowRoomTasks = (ImageButton) ConvertView.findViewById(R.id.btnShowRoomTasks);

        rowView.RowLayout = (RelativeLayout) ConvertView.findViewById(R.id.rowLayout);


        ConvertView.setTag(rowView);
    }
    else
    {
        rowView = (Room_View) ConvertView.getTag();
    }

    //Here custom your control stats
    Room_Object Room = Rooms_Array.get(position);
    rowView.RoomName.setText(Room.getRoomName());

    rowView.NoTroubles.setVisibility(View.INVISIBLE);
    rowView.btnShowRoomTasks.setClickable(true);
    rowView.btnShowRoomTasks.setImageResource(R.drawable.list_3a4b66_50);
    rowView.btnShowRoomTasks.setOnClickListener(OnShowTasksClickListener);

    //This is for add ClickListiner in my buttons...
    rowView.btnAddTasks.setOnClickListener(OnAddTasksClickListener);
    rowView.btnRoomRow.setOnClickListener(OnAddTasksClickListener);

    if(Room.getStatus().equals("Checked")){
        rowView.RowLayout.setBackgroundColor(0xFFC7E6C7);
        rowView.btnShowRoomTasks.setClickable(false);
        rowView.btnShowRoomTasks.setImageResource(R.drawable.list_999999_50);
        rowView.RoomState.setImageResource(R.drawable.check_3ebf4b_50);
    }
    else if(Room.getStatus().equals("Blocked")){
        rowView.RowLayout.setBackgroundColor(0xFFDBC3E5);
        rowView.RoomState.setImageResource(R.drawable.key_9330e0_50);
    }
    else if(Room.getStatus().equals("Dirty")){
        rowView.RowLayout.setBackgroundColor(0xfffceedb);
        rowView.RoomState.setImageResource(R.drawable.icon_Housekeeping_3_yellow);
    }
    else if(Room.getStatus().equals("Troubled")){
        rowView.RowLayout.setBackgroundColor(0xFFF4CECD);
        rowView.RoomState.setImageResource(R.drawable.wrench_eb3232_50);

        rowView.NoTroubles.setVisibility(View.VISIBLE);
        try {
            rowView.NoTroubles.setText(Integer.toString(Room.getNoTasks()));
        }
        catch (Exception ex){
            Log.e("-- Error --",ex.getMessage());
        }
    }

    //
    //Pay attention *************************************************
    //

    //Now if you needs to use your custom external class this is the site, now imagine that you need gets string from your custom class in the text view, then:

    //Declare class
    CustomClass object = new CustomClass();

    rowView.(CUSTOM CONTROL FROM YOUR STATIC CLASS).(METHOD OF CONTROL)(object.(CUSTOM METHOD OF YOUR OBJECT));

    //For example If you follows my sample then:
    rowView.NoTroubles.setText(object.getNumberOfTroubles().toString);


    return ConvertView;
}

//Listener Methods for my button controls
private View.OnClickListener OnShowTasksClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int positionSelected = lvBuinding.getPositionForView((View) v.getParent());
        int totalRooms = lvBuinding.getCount() - 1;
        int actualRoom = totalRooms - positionSelected;

        try{
            //Your code;
        }
        catch (Exception ex){
            Log.e("-- CustomError --", ex.getMessage());
        }
    }
};

private View.OnClickListener OnAddTasksClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int positionSelected = lvBuinding.getPositionForView((View) v.getParent());
        int totalRooms = lvBuinding.getCount() - 1;
        int actualRoom = totalRooms - positionSelected;

        try{
            //Your code;
        }
        catch (Exception ex){
            Log.e("-- CustomError --", ex.getMessage());
        }
    }
};
}

私はこれがあなたが必要としていることだと思います、あなたがより多くの情報または同じアドバイスを必要とするならば私と私はあなたを助けようとします...頑張ってください、エドゥアルド!

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                CustomObject obj = allObjects.get(position);
                //Now use obj to access the property
                Uri uri = Uri.parse( "http://www.google.com" );
                startActivity(new Intent(Intent.ACTION_VIEW, uri));
            }
        });
0
Arfan Mirza