получить элемент списка из ListView - PullRequest
0 голосов
/ 11 ноября 2018

Я заинтересован в получении ссылки на объект для элемента списка в ListView при нажатии на этот элемент. Каждый элемент в моем пользовательском элементе XML содержит Button и TextView, которые по умолчанию hidden. Клик по предмету должен изменить их visibility на visible.
Вот что я имею в виду, сделано в интегрированном графическом редакторе.

enter image description here

Должен стать таким

enter image description here

Это мой пользовательский getView для AdapterView


@Override
public View getView(int position, View v, ViewGroup viewGroup){

    if(v==null){
        LayoutInflater li= LayoutInflater.from(getContext());
        v= li.inflate(R.layout.custom_list_item, null);
    }

    Student s= getItem(position);
    TextView name= v.findViewById(R.id.txt_name);
    TextView surname= v.findViewById(R.id.txt_surname);
    TextView id= v.findViewById(R.id.txt_id);

    //following methods come from my Student class
    if(s != null){
        name.setText(s.getName());
        surname.setText(s.getSurname());
        id.setText(s.getId());
    }
    return v;
}

и вот что я (хотел бы) сделать в своей Деятельности, но пока не работает.


ListView list= findViewById(R.id.advanced_list);
    final StudentAdapter adapter= new StudentAdapter(
            this,
            R.layout.custom_list_item,
            getStudents()
    );

    list.setAdapter(adapter);


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

            TextView tel= findViewById(R.id.txt_tel);
            Button delete= findViewById(R.id.btn_delete);

            tel.setVisibility(View.VISIBLE);
            delete.setVisibility(View.VISIBLE);
        }
    });

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вы можете переключать видимость в самой строке listView. Сначала я хотел бы заявить о проблеме, обнаруженной в вашем коде:

TextView tel = findViewById (R.id.txt_tel);

это должно быть TextView tel= view.findViewById(R.id.txt_tel);, так как телефон TextView не является частью вашего основного макета, а вместо этого макета listView. Ниже приведены два объяснения того, как обрабатывать видимость.

Базовый ответ: В методе public View getView просто установите onClickListener или onTouchListener для любого элемента, по которому вы хотите щелкнуть, чтобы сделать остальные видимыми. Чтобы переключить видимость ваших TextViews, просто сделайте textView.setVisibility(View.VISIBLE); и поместите это в onClickListener. Весь этот код должен быть в вашем адаптере ListView.

Разработанный ответ: Вот код

public class MyAdapter extends ArrayAdapter<MyClass> {
     private Context mContext;
     Activity activity;
     private List<MyClass> class = new ArrayList<>();

     public LogAdapter(Activity a, Context context, ArrayList<MyClass> list) {
         super(context, 0, list);
         mContext = context;
         activity = a;
         class= list;
     }
     @NonNull
     @Override
     public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
         View listItem = convertView;
         if (listItem == null){
             //If the row is empty, inflate it with your elements found in the 'mylistview' layout file.
             listItem = LayoutInflater.from(mContext).inflate(R.layout.mylistview, parent, false);
         }
         //These names and views are made up. You can change them to suit your needs for which items should become visible on a certain items click.
         Button changeVisibility = listItem.findViewById(R.id.change);
         TextView name = listItem.findViewById(R.id.name);
         TextView surname = listItem.findViewById(R.id.surname);

         changeVisibility.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(final View view) {
                 name.setVisibility(View.VISIBLE);
                 surname.setVisibility(View.VISIBLE);
             }
         }
    }
}

Имена, такие как MyAdapter и класс MyClass - это только примеры, их нужно создать. Как только вы это сделаете, ваш класс Adapter должен выглядеть как мой выше. Вы также можете изменить имя кнопки и TextView, это зависит только от того, каким файлом макета вы надуете свой listItem.

Если у вас все еще есть проблемы с вашим кодом, проверьте эту ссылку для объяснения того, как сделать ваш собственный просмотр списка с нуля. Надеюсь, это поможет!

0 голосов
/ 11 ноября 2018
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        TextView tel= findViewById(R.id.txt_tel);
        Button delete= findViewById(R.id.btn_delete);

        tel.setVisibility(View.VISIBLE);
        delete.setVisibility(View.VISIBLE);
    }
});

Вы пытаетесь найти View s в макете Activity, но они находятся в View, который вы получаете в качестве параметра. Вы можете исправить это так:

...
TextView tel= view.findViewById(R.id.txt_tel);
Button delete= view.findViewById(R.id.btn_delete);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...