java - Baseadapter 中的 Android Listview 如何保存对列表的更改

标签 java android listview android-listview baseadapter

我一直在这里阅读有关基础适配器的不同帖子,并尝试学习以便解决我的问题,但我一直无法解决它。在我的 BaseAdapter 上,我有一个名为 post 的字符串,用于 ListView 的列中。如果帖子长度超过 13 个字符,那么当用户单击缩短的帖子时,它会自动缩短,然后它会显示完整长度,但问题是,一旦您向下滚动 ListView 并返回到同一篇帖子,它仍然会被缩短即使用户之前单击过以显示完整的帖子。我认为这是 Listview 或 Baseadapter 回收或缓存机制的问题,我可以解决这个问题吗?这张图片会让事情变得清晰..这篇文章超过 13 个字符,所以它显示了缩短的版本

enter image description here

如果用户想完整阅读它,那么他们将单击“阅读更多”,然后将显示如下所示的所有内容

enter image description here

当用户向下或向上滚动时,同一个长帖子将返回到此,而无需用户再次单击它,我想避免这种情况

enter image description here

我知道 Listview 会回收,但我如何更新它?这是我的代码如下

public class LocalFeed_CustomView extends BaseAdapter {

 JSONObject names;
    Context ctx;
    Activity m;
    // More is the default value
    String result="More";

    @Override
    public int getCount() {
        try {
            JSONArray jaLocalstreams = names.getJSONArray("localstreams");
            return jaLocalstreams.length();
        } catch (Exception e) {
            Toast.makeText(ctx, "Error: Please try again", Toast.LENGTH_LONG).show();
            return names.length();
        }


    }


    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row=convertView;
        MyViewHolder holder=null;
        try {
            if (row == null) {

                LayoutInflater li = (LayoutInflater) m.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = li.inflate(R.layout.customadapter, null);
                holder = new MyViewHolder(row);
                row.setTag(holder);


            } else {
                holder = (MyViewHolder) row.getTag();
            }


           final MyViewHolder finalHolder1=holder;
        // Json data has been read
            JSONArray jaLocalstreams = names.getJSONArray("localstreams");
            final JSONObject jsonObject = jaLocalstreams.getJSONObject(position);
            // if post length is more than 14 then shorten it
            if (jsonObject.getString("post").length() > 14) {
                holder.post.setText(jsonObject.getString("post").substring(0, 13) + "...Read More");
                holder.post.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        try {
                              // if Result is More then show full post
                            if (result.equals("More")) {
                                finalHolder1.post.setText(jsonObject.getString("post") + "... Read Less");
                                result = "Less";
                            }
                            else
                            {
                                //Result is Less so shorten it again
                                finalHolder1.post.setText(jsonObject.getString("post").substring(0, 13) + "... Read More");
                            result = "More";
                        }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });

        } else{
                // This Post is already less than 14 characters so no Onclick here
            holder.post.setText(jsonObject.getString("post"));
        }

            return row;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return row;


    }






    class MyViewHolder{
        TextView post;
        MyViewHolder(View v)
        {

           post = (TextView)v.findViewById(R.id.post);

        }

    }

}

最佳答案

适配器代表任何给定时刻的列表模型。

这对您来说意味着,如果用户单击 TextView 将其展开,并认为该 View 将保持展开状态,那么展开的 TextView 就是必须在适配器中捕获的状态信息。

适配器应始终分为两个阶段来考虑:

  • 事件(如 onClick())将更新适配器中的状态并调用 notifyDataSetChanged()
  • getView() 使用当前状态来创建 View 。

假设我们在适配器构造函数中创建了一个标志数组

    boolean expanded[] = new boolean[size];

其中size是列表的长度。

然后你可以这样做:

            // use the current state to create the view
            String text;
            if (expanded[position]) {
                text = jsonObject.getString("post") + "... Read Less";
            } else {
                text = jsonObject.getString("post").substring(0, 13) + "...Read More";
            }
            holder.post.setText(text);
            holder.post.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // update the current state and request list refresh
                    expanded[position] = ! expanded[position];    // toggle
                    notifyDataSetChanged();
                }
            });

这段代码并不完全符合你的代码,我只是想给你提供基本的想法。

关于java - Baseadapter 中的 Android Listview 如何保存对列表的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33087724/

相关文章:

java - if 条件在 selenium webdriver 中出现错误

java - Spring namedParameterJdbcTemplate 和一个列表参数 : how to check if it is null in SQL?

Android SeekBar 最小和连续浮点值属性

android - React Native 中的 RecyclerView : notifyItemInserted() and notifyDataSetChanged() have no effect

java - 如何在线程结束时执行函数?

javascript - 未捕获的类型错误 : undefined is not a function Calling JavaScript Function

javascript - react native ListView 键

java - Spring MVC 支持动态填充选择框

java - 如何在 Jersey Trace 中打印漂亮的 JSON?

java - ListView 滚动不起作用