如何在BaseAdapter中完成Asynctask之后修改单个列表项

时间:2015-04-29 14:58:16

标签: java android listview android-listview android-asynctask

在我的主要活动中,我显示ListView,它使用自定义BaseAdapter(ThoughtListAdapter)。

listView = (ListView) findViewById(R.id.list);
adapter = new ThoughtListAdapter(this, resultingThoughts);
listView.setAdapter(adapter);

ListView中的每个项目都有一个自定义布局,其中包含TextView和两个Button

if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.list_item_thought, null);
}

thoughtText = (TextView) convertView.findViewById(R.id.thought_text_view);
likeButton = (Button) convertView.findViewById(R.id.thought_like_button);
dislikeButton = (Button) convertView.findViewById(R.id.thought_dislike_button);

单击Button时,会调用AsyncTask(AsyncPost)连接到我的数据库并进行一些更改。

likeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            System.out.println("LIKE CLICKED");
            Thought t = thoughtItems.get(position);
            thoughtId = t.getId();
            opinion = 1;

            AsyncPost asyncPost = new AsyncPost(activity,ThoughtListAdapter.this);
            asyncPost.execute(SHARE_THOUGHT_URL,
                    TAG_PERSON_EMAIL, "m@b.it",
                    TAG_THOUGHT_ID, thoughtId.toString(),
                    TAG_OPINION, opinion.toString());
        }
    });

我需要的是在Button完成成功后,使列表项的两个AsyncTask - s消失。我有一个方法onComplete(JSONObject json),它详细说明了JSONObject返回的AsyncTask。我尝试在onComplete方法中使按钮不可见,但这不起作用,因为onComplete()不知道单击了哪个确切的按钮。 如何在onComplete()内传递完全点击按钮的实例,并仅消除相关列表项的“喜欢”和“不喜欢”按钮?

AsyncPost是我所有其他活动使用的全局AsyncTask。我强烈希望不管它。 onComplete()方法用作onPostExecute()的{​​{1}}方法。 以下是我AsyncTask中的getView()onComplete()方法,其中包含上面显示的所有代码。 谢谢。

BaseAdapter

1 个答案:

答案 0 :(得分:0)

对此的一个解决方案是在Thought对象上添加一些内容,以指示是否显示按钮。

因此,在getView()方法中,您可以查看

likeButton = (Button) convertView.findViewById(R.id.thought_like_button);
dislikeButton = (Button) convertView.findViewById(R.id.thought_dislike_button);

Thought t = thoughtItems.get(position);
if (t.hideButtons()) {
    likeButton.setVisibility(View.GONE);
    dislikeButton.setVisibility(View.GONE); 
}
else {
    likeButton.setVisibility(View.VISIBLE);
    dislikeButton.setVisibility(View.VISIBLE); 
}

然后,您需要让onComplete方法返回与其相关的id对象的Thought。然后在你的onComplete内进行

int id = //get your id from your JSON response
for(Thought t : thoughtItems) {
    if (t.getId() == id) {
        t.setHideButtons(true);
        notifyDataSetChanged();
        break;
    }
}

通过调用notifyDataSetChanged(),它会重新绘制您的列表,当它检查是否应该显示按钮时,它不会显示它们,因为它是在该思想项上设置的