2014-06-25 49 views
0

我从我的数据库获取数据并将它们推送到ListView中以查看所有数据。Android列表查看当前位置无法正常工作

里面我的ListView我也有它的文本“像”一个TextView。现在,当我点击文字时,它会变成“喜欢”,我正在更新我的数据库中的状态。

现在我的问题是,当我点击“赞”的文本,该文本更改为“喜欢”,也被在DB更新。但是当我滚动浏览列表视图时,我可以注意到其他列表“Like text”也变为“Like”。我不确定发生了什么问题。

我一直在试图解决这个问题相当长的一段日子,但没有成功。

这是我的适配器代码。在底部,你可以看到我onClickListener为TextView的

package com.mytestapp.myapp; 

import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.content.Context; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ForumAdapter extends ArrayAdapter<DiscussionList> { 
    private static List<DiscussionList> items = null; 

    public ForumAdapter(Context context, List<DiscussionList> items) { 
     super(context, R.layout.custom_list, items); 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    public static DiscussionList getModelPosition(int position) { 
     return items.get(position); 
    } 

    public void refill(List<DiscussionList> items) { 
     items.clear(); 
     items.addAll(items); 
     notifyDataSetChanged(); 
    } 

    public static class ViewHolder { 
     WebView mywebviewholder; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater li = LayoutInflater.from(getContext()); 
      v = li.inflate(R.layout.custom_list, null); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     DiscussionList app = items.get(position); 

     if (app != null) { 
      TextView titleText = (TextView) v.findViewById(R.id.dscTitle); 
      TextView categoryText = (TextView) v.findViewById(R.id.dscCategory); 
      TextView descriptionText = (TextView) v 
        .findViewById(R.id.dscDescription); 
      TextView timeText = (TextView) v.findViewById(R.id.dscTime); 
      TextView idText = (TextView) v.findViewById(R.id.dscDiscId); 
      final TextView likeText = (TextView) v.findViewById(R.id.likeText1); 
      String like_Status = app.getLikeStatus(); 

      titleText.setText(app.getTitle()); 
      categoryText.setText(app.getCategory()); 
      descriptionText.setText(app.getDescription()); 
      timeText.setText(app.getTime()); 
      idText.setText(app.getDiscId()); 
      if (like_Status == "null") { 
       likeText.setText("Like"); 
      } else { 
       likeText.setText("Liked"); 
      } 

      final String dId = app.getDiscId(); 

      // onClick for image button inside list view 

      likeText.setTag(new Integer(position)); 
      likeText.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        final Integer myposition = (Integer) view.getTag(); 
        // Toast.makeText(getContext(), "" + dId, 
        // Toast.LENGTH_SHORT) 
        // .show(); 
        likeText.setText("Liked"); 
        MainActivity val = new MainActivity(); 
        val.updateLikeTable(dId); 
       } 

      }); 

     } 

     return v; 
    } 
} 

而且也这是我MainActivity.java文件,其中更新我喜欢在数据库

package com.mytestapp.myapp; 

import java.net.URI; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.Toast; 

public class MainActivity extends ListActivity implements FetchDataListener { 
    public static String strTitle = "0", strCategory = "0", 
      strDescription = "0", strTime = "0", strDid = "0"; 
    Collegemate_DB db = new Collegemate_DB(this); 
    int likeStatus = 1; 
    private ProgressDialog dialog; 
    public static String usId=null; 
    ImageButton imgButton; 
    List<DiscussionList> items = new ArrayList<DiscussionList>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_forum_topics); 
     usId = db.getCurrentuserId(); 
     initView(); 

     if (android.os.Build.VERSION.SDK_INT > 9) { 
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
        .permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
     } 
     /* 
     * On click listener to get values from DiscussionList class and send it 
     * to another activity when clicking on the list item 
     */ 

     ListView forumList = getListView(); 
     forumList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // Get position of the clicked list item from adapter 

       String dTitle, dCategory, dDescription, dTime, dDid; 

       DiscussionList accessVar = ForumAdapter 
         .getModelPosition(position); 
       dTitle = accessVar.getTitle(); 
       dCategory = accessVar.getCategory(); 
       dDescription = accessVar.getDescription(); 
       dTime = accessVar.getTime(); 
       dDid = accessVar.getDiscId(); 

       /* 
       * Storing the forum values in string and passing it to another 
       * activity 
       */ 

       String values[] = { dTitle, dCategory, dDescription, dTime, 
         dDid }; 
       Intent i = new Intent(MainActivity.this, ForumFullView.class); 
       i.putExtra("sendData", values); 
       startActivity(i); 
      } 
     }); 
    } 

    private void initView() { 
     // show progress dialog 
     Log.i("j","Inside Init"); 
     dialog = ProgressDialog.show(this, "", "Loading..."); 

     String url = "http://example.com/mypath/listData.php?currentUser_id=" 
       + usId; 
     Log.i("Fetch Url : ", url); 
     FetchDataTask task = new FetchDataTask(this); 
     task.execute(url); 
    } 

    @Override 
    public void onFetchComplete(List<DiscussionList> data) { 
     // dismiss the progress dialog 
     if (dialog != null) 
      dialog.dismiss(); 
     // create new adapter 
     ListView forumList = getListView(); 
     // set the adapter to list 
     ForumAdapter adapter = new ForumAdapter(this, data); 
     if (forumList.getAdapter() == null) { 
      //final ForumAdapter adapter = new ForumAdapter(this, data); 
      forumList.setAdapter(adapter); 
     } else { 
      ((ForumAdapter) forumList.getAdapter()).refill(items); 
     } 
     // setListAdapter(adapter); 
    } 

    @Override 
    public void onFetchFailure(String msg) { 
     // dismiss the progress dialog 
     if (dialog != null) 
      dialog.dismiss(); 
     // show failure message 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
    } 

    public void updateLikeTable(String dId,List<DiscussionList> items) { 
     try { 
      String likeUrl = "http://example.com/mypath/createlike.php?discId=" 
        + dId + "&userId=" + usId + "&like_status=" + likeStatus; 
      HttpClient client = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(); 
      request.setURI(new URI(likeUrl)); 
      client.execute(request); 

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

任何帮助表示赞赏。

在此先感谢

回答

1

您遇到的问题是如果可以的ListView部件回收其观点。一旦视图从滚动屏幕上离开,它就会进入垃圾堆,这样当新视图滚动到位时,它可以被重用,而不需要从头开始新的视图。该回收视图是getView()方法中的convertView参数。当您的ListView第一次填充时,convertView将始终为空,因为垃圾堆中没有任何内容,所以您不得不膨胀新视图,但随后的调用可能会将该参数视为非null。

这样做的实际结果是,当设置为“喜欢”的点击视图被回收时,TextView仍然存在,仍然填充“喜欢”而不是假定的“喜欢”默认值。所以,如果你点击一个视图,然后向下滚动,以便它离开屏幕,它会回来并导致你看到的错误。

您可能想要解决的问题是,根据数据库中的内容,每次都在getView()以内设置likeText的文本。如果帖子被喜欢,将其设置为“喜欢”,如果没有,则将其设置为“喜欢”。它应该只是一条线,假设您可以轻松访问您的DiscussionList对象是否喜欢这篇文章。

P.S.作为附注,硬编码字符串通常在Android中不受欢迎,因此您可能需要将“喜欢的”字符串移动到资源文件中。这不是真的需要,除非你打算翻译,但它仍然是一个好习惯。

+0

是的,谢谢你的出色答案。是的,我可以在创建列表时从数据库本身设置liketext的文本。但是,当用户想要点击一个他不喜欢的帖子时,会发生什么?现在我的onCLickListener也在我的getView()里面。有没有一种方法可以将文本设置为“喜欢”仅用于当前我点击的列表项目?或者有没有办法告诉android记住列表视图的位置,即使它滚动? –

+0

据我所见,你的点击监听器应该是原样的。 'getView()'中的'position'变量在数据集中将是绝对的,并且您正在使用/使用正确的'likeText'和'dId'。它是不是像预期的那样行事,如果是这样,究竟它究竟是什么呢? – Alex

+0

嘿,对不起,迟交回复。从数据库中获取并在textview中显示它之后,我的喜欢和喜欢的文本现在保持正确。但是现在我的问题是,当我点击任何一个Liketext为“Like”的列表时,它会更新为“喜欢”,但当我向下滚动并回滚时,它会再次变为“Like”。我不知道这里出了什么问题。 –

相关问题