Android Baseadapter 中的 Listview 如何保存对列表的更改
Android Listview in Baseadapter how can I save changes to the list
我在这里阅读了不同的 posts 关于 baseadapters 并尝试学习以便我可以解决我的问题,但我一直无法解决它。在我的 BaseAdapter 上,我有一个名为 post 的字符串,用于列表视图的列中。如果 post 长于 13 个字符,那么当用户点击缩短的 post 时它会自动缩短然后显示它的全长,但是问题是一旦你向下滚动列表视图并返回直到相同的 post,即使用户之前单击以显示完整的 post,它仍然会缩短。我认为这是 Listview 或 Baseadapter 回收或缓存机制的问题,无论如何我可以解决这个问题吗?这张图片会把事情搞清楚。这个 post 超过 13 个字符,所以显示的是缩短版
如果用户想要完整阅读它,那么他们将单击“阅读更多”,然后将显示所有内容,如下所示
并且当用户向下或向上滚动时,同样长的 post 将 return 到此而无需用户再次单击它,我想避免这种情况
我知道 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 以展开它,并认为该视图将保持展开状态,那么展开的 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();
}
});
此代码与您的代码不完全相同,我只是想为您提供基本思路。
我在这里阅读了不同的 posts 关于 baseadapters 并尝试学习以便我可以解决我的问题,但我一直无法解决它。在我的 BaseAdapter 上,我有一个名为 post 的字符串,用于列表视图的列中。如果 post 长于 13 个字符,那么当用户点击缩短的 post 时它会自动缩短然后显示它的全长,但是问题是一旦你向下滚动列表视图并返回直到相同的 post,即使用户之前单击以显示完整的 post,它仍然会缩短。我认为这是 Listview 或 Baseadapter 回收或缓存机制的问题,无论如何我可以解决这个问题吗?这张图片会把事情搞清楚。这个 post 超过 13 个字符,所以显示的是缩短版
如果用户想要完整阅读它,那么他们将单击“阅读更多”,然后将显示所有内容,如下所示
并且当用户向下或向上滚动时,同样长的 post 将 return 到此而无需用户再次单击它,我想避免这种情况
我知道 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 以展开它,并认为该视图将保持展开状态,那么展开的 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();
}
});
此代码与您的代码不完全相同,我只是想为您提供基本思路。