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

Posted

技术标签:

【中文标题】Baseadapter中的Android Listview如何保存对列表的更改【英文标题】:Android Listview in Baseadapter how can I save changes to the list 【发布时间】:2016-01-10 07:43:20 【问题描述】:

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

如果用户想要完整阅读它,那么他们将点击阅读更多内容,然后会显示所有类似这样的内容

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

我知道 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);

        

    


【问题讨论】:

【参考方案1】:

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

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

应始终将适配器分为两个阶段:

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

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

    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();
                
            );

这段代码和你的不完全一样,我只是想给你一个基本的想法。

【讨论】:

以上是关于Baseadapter中的Android Listview如何保存对列表的更改的主要内容,如果未能解决你的问题,请参考以下文章

Android使用BaseAdapter实现复杂的ListView

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

Android适配器之ArrayAdapterSimpleAdapter和BaseAdapter的简单用法

Android ListView重写BaseAdapter如何改变指定item中的TextView的颜色?

notifyDataSetChanged() 在 BaseAdapter 中无法使用 android 中的复选框列表

ListView BaseAdapter 中的 EditText 奇怪行为