Скрыть / показать элементы в элементе ListView после щелчка - PullRequest
0 голосов
/ 06 июня 2018

У меня есть Fragment, который содержит ListView.Элементы ListView содержат элементы TextView и Button.Когда я нажимаю кнопку в просмотре списка, я хочу обновить строку, в которой я нажал кнопку, чтобы скрыть кнопку и отобразить TextView (текст внутри TextView также необходимо обновлять каждую секунду).

Возможно ли это и как?

MyFragment
public class MyFragment extends Fragment implements ClickedListener {
    private static final String TAG = MyFragment.class.getSimpleName();

    private MyListAdapter myListAdapter;

    public MyFragment() {
        // Required empty public constructor
        Log.e(TAG, "MyFragmment");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.e(TAG, "onCreateView");
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_mine, container, false);

        ListView myListView = view.findViewById(R.id.listView);

        myListAdapter = new MyListAdapter(getActivity(), MyFragment.this);
        myListView.setAdapter(myListAdapter);

        getList();

        return view;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isResumed()) {
            getList();
        }
    }

    private void getList() { //This part works no need to discuss this.
        List<Items> items = myItemsContent.getItems();
                    myListAdapter.setItems(items);
    }

    @Override
    public void buttonClicked(Item item) {
        doSomeStuff();
        myListAdapter.displayTextView();
    }
}
MyListAdapter
public class MyListAdapter extends ArrayAdapter<Item> {
    private static final String TAG = MyListAdapter.class.getSimpleName();

    private Button myButton;
    private TextView status;

    private final Context context;

    public interface ClickedListener {
        void buttonClicked(Item item);
    }

    private final ClickedListener clickedListener;

    public MyListAdapter(@NonNull Context context, ClickedListener clickedListener) {
        super(context, R.layout.list_item);

        this.context = context;
        this.clickedListener = clickedListener;
    }

    public void setItems(List<Items> items) {
        super.addAll(items);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.list_item, parent, false);
        }

        TextView itemName = row.findViewById(R.id.list_item_name);
        myButton = row.findViewById(R.id.myButton);
        status = row.findViewById(R.id.status);

        Item item = getItem(position);
        if (item != null) {
            itemName.setText(item.getName());

            myButton.setOnClickListener(v -> clickedListener.buttonClicked(item));
        }

        return row;
    }

    public void displayTextView() {
        myButton.setVisibility(View.INVISIBLE);
        status.setVisibility(View.VISIBLE);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я сделаю это более надежным способом.Я думаю, что вы знаете работу Listview и адаптера.

Итак, у вас есть список предметов, которые вы передаете на свой адаптер.Я изменю свой класс Item следующим образом.Пожалуйста, добавьте эти два поля в класс Item, который, я думаю, является моделью

public boolean isButtonVisible = true;
public boolean isTextViewVisible = false;

Идите головой, создайте заголовок и установщик. Или измените любое значение по умолчанию

теперь в вашем методе getViewАдаптер делает это в конце // Или просто скопируйте replace

    @NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View row = convertView;

    if (row == null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.list_item, parent, false);
    }

    TextView itemName = row.findViewById(R.id.list_item_name);
    myButton = row.findViewById(R.id.myButton);
    status = row.findViewById(R.id.status);

    Item item = getItem(position);
    if (item != null) {
        itemName.setText(item.getName());

        myButton.setOnClickListener(v -> clickedListener.buttonClicked(item));

       if(item.isButtonVisible){
        myButton.setVisiblity(View.VISIBLE);
       }else{
       myButton.setVisibilty(View.GONE)        
       }

       if(item.isTextViewVisible){
        myTextView.setVisiblity(View.VISIBLE);
       }else{
       myTextView.setVisibilty(View.GONE)        
       }

    }

    return row;
    }

Наконец, сделайте это в своем фрагменте внутри следующего метода

 @Override
   public void buttonClicked(Item item) {
    doSomeStuff();
    item.setButtonVisibility (Whatever you want to do true or false)
    ite.setTextViewVisible  (Whatever you want to do true or false)
    myListAdapter.notifyDataSetChanged(); 
    }

Важно: Вам необходимо вызвать myListAdapter.notifyDataSetChanged () в конце.вам не нужно вызывать myListAdapter.displayTextView ();как это не будет работать

0 голосов
/ 06 июня 2018

Вы можете получить событие нажатия кнопки во фрагменте, а затем установить логическую переменную для модели и в соответствии с этим показать / скрыть текстовое представление в адаптере.

...