【问题标题】:Hide/Show elements in a ListView item after a click单击后隐藏/显示 ListView 项目中的元素
【发布时间】:2018-06-06 07:08:53
【问题描述】:

我有一个Fragment,其中包含一个ListViewListView 项目包含 TextViewButton 元素。当我在列表视图中按下按钮时,我想更新单击按钮以隐藏按钮并显示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);
    }
}

【问题讨论】:

    标签: android listview android-fragments show-hide listadapter


    【解决方案1】:

    我会以更可靠的方式来做。我想你知道 Listview 和适配器的工作原理。

    因此,您有要传递给适配器的项目列表。我将通过以下方式更改我的 Item 类。请在我认为是模型的 Item 类中添加这两个字段

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

    去头创建header和setter。或者更改任何默认值

    现在在 Adapter 的 getView 方法中最后这样做 //或者只是复制替换

        @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();作为 这行不通

    【讨论】:

    • 与 Dhara Jani 的答案相同,但带有代码,感谢您的帮助!
    • @jeroen 我正在输入代码,我没有看到他的答案
    • @Sharanti KAKA 这不是问题,我认为这对其他有同样问题的人会更有帮助。
    【解决方案2】:

    您可以在片段中获取按钮单击事件,然后将布尔变量设置为模型并根据适配器中的显示/隐藏文本视图。

    【讨论】:

    • 是的,这就是解决方案。没有想到这一点。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多