2017-02-11 32 views
3

我有一個列表視圖,通過mysql數據庫填充行。在列表視圖中查找Imageview的位置

這就是我所做的一個觀點:出現在每一行中

enter image description here

這個名字你看到從我的數據庫來和PLAY ImageView的是從我的佈局列表(當我添加一個名字到我的數據庫中)。

現在我的問題是,當我設置一個點擊偵聽器,該播放按鈕,(目的是切換到暫停ImageView等)它改變另一個播放按鈕從其他行,但不是所有的人。因此,我認爲我沒有得到這個位置,對吧?你能幫我解決這個問題嗎?

這是我的片段:

public class XXXUpdatesFragment extends Fragment implements AsyncResponse 
,AdapterView.OnItemClickListener{ 

    View view ; 
    private ArrayList<Product> productList; 
    private ListView lvProduct; 
    private FunDapter<Product> adapter; 


    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.xxx_updates_layout, container, false); 
     ImageLoader.getInstance().init(UILConfig.config(getActivity())); 

     lvProduct = (ListView)view.findViewById(R.id.lvProduct); 

     PostResponseAsyncTask taskRead = new PostResponseAsyncTask(getActivity(), this); 

     taskRead.execute("http://symphonyrecords.6te.net/product.php"); 

     return view; 
    } //onCreate 


    @Override 
    public void processFinish(String s) { 
     productList = new JsonConverter<Product>().toArrayList(s, Product.class); 

     BindDictionary<Product> dict = new BindDictionary<Product>(); 
     dict.addStringField(R.id.tvName, new StringExtractor<Product>() { 
      @Override 
      public String getStringValue(Product product, int position) { 
       return product.name; 
      } 
     }); 

     dict.addStringField(R.id.tvDescription, new StringExtractor<Product>() { 
      @Override 
      public String getStringValue(Product product, int position) { 
       return product.description; 
      } 
     }); 

     dict.addStringField(R.id.tvQty, new StringExtractor<Product>() { 
      @Override 
      public String getStringValue(Product product, int position) { 
       return "" + product.qty; 
      } 
     }); 


     adapter = new FunDapter<>(getActivity(), productList, R.layout.d_layout_list_d, dict); 


     lvProduct.setAdapter(adapter); 
     lvProduct.setOnItemClickListener(this); 

    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Product selectedProduct = productList.get(position); 
     Toast.makeText(getActivity(),selectedProduct.name+"", Toast.LENGTH_SHORT).show(); 
     } 


    } 

這是我的產品類別:

public class Product implements Serializable { 
@SerializedName("pid") 
public int pid; 

@SerializedName("name") 
public String name; 

@SerializedName("qty") 
public int qty; 

@SerializedName("price") 
public String description; 
} 

這是我的適配器:

public class FunDapter<T> extends BaseAdapter implements Filterable { 



private boolean paused = true; 


protected List<T> mDataItems; 
protected List<T> mOrigDataItems; 
protected LongExtractor<T> idExtractor; 
protected final Context mContext; 
private final int mLayoutResource; 
private final BindDictionary<T> mBindDictionary; 
private int oddColorRes; 
private int evenColorRes; 
private FunDapterFilter<T> funDapterFilter; 
private Filter mFilter; 


public FunDapter(Context context, List<T> dataItems, int layoutResource, 
       BindDictionary<T> dictionary) { 
    this(context, dataItems, layoutResource, null, dictionary); 
} 

public FunDapter(Context context, List<T> dataItems, int layoutResource, 
       LongExtractor<T> idExtractor, BindDictionary<T> dictionary) { 
    this.mContext = context; 
    this.mDataItems = dataItems; 
    this.mOrigDataItems = dataItems; 
    this.mLayoutResource = layoutResource; 
    this.idExtractor = idExtractor; 
    this.mBindDictionary = dictionary; 

} 

public void updateData(List<T> dataItems) { 
    this.mDataItems = dataItems; 
    this.mOrigDataItems = dataItems; 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    if (mDataItems == null || mBindDictionary == null) return 0; 

    return mDataItems.size(); 
} 

@Override 
public T getItem(int position) { 
    return mDataItems.get(position); 
} 

@Override 
public boolean hasStableIds() { 
    if(idExtractor == null) return super.hasStableIds(); 
    else return true; 
} 

@Override 
public long getItemId(int position) { 
    if(idExtractor == null) return position; 
    else return idExtractor.getLongValue(getItem(position), position); 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    final GenericViewHolder holder; 
    if (null == v) { 
     LayoutInflater vi = 
       (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = vi.inflate(mLayoutResource, null); 
     holder = new GenericViewHolder(); 
     holder.root = v; 


     holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
     holder.playPause.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

         if (paused) { 
          holder.playPause.setImageResource(R.drawable.ic_pause); 
          paused=false; 
         } 
         else { 
          paused = true; 
          holder.playPause.setImageResource(R.drawable.ic_play); 
         } 

      }}); 



     FunDapterUtils.initViews(v, holder, mBindDictionary); 

     v.setTag(holder); 


    } else { 
     holder = (GenericViewHolder) v.getTag(); 
    } 

    final T item = getItem(position); 
    showData(item, holder, position); 

    return v; 
} 


private void showData(T item, GenericViewHolder holder, int position) { 

    if (oddColorRes > 0 && evenColorRes > 0) { 
     if (position % 2 == 0) { 
      holder.root.setBackgroundColor(mContext.getResources().getColor(evenColorRes)); 
     } else { 
      holder.root.setBackgroundColor(mContext.getResources().getColor(oddColorRes)); 
     } 
    } 

    FunDapterUtils.showData(item, holder, position, mBindDictionary); 
} 

public FunDapter<T> setAlternatingBackground(int oddColorRes, int evenColorRes) { 

    if (oddColorRes <= 0 || evenColorRes <= 0) { 
     throw new IllegalArgumentException("Color parameters are illegal"); 
    } 

    this.oddColorRes = oddColorRes; 
    this.evenColorRes = evenColorRes; 

    return this; 
} 

public void setIdExtractor(LongExtractor<T> idExtractor) { 
    this.idExtractor = idExtractor; 
} 

@Override 
public Filter getFilter() { 
    return mFilter; 
} 

public void initFilter(FunDapterFilter<T> filter) { 

    if (filter == null) 
     throw new IllegalArgumentException("Cannot pass a null filter to FunDapter"); 

    this.funDapterFilter = filter; 

    mFilter = new Filter() { 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 

      List<T> list = (List<T>) results.values; 

      if (results.count == 0) { 
       resetData(); 
      } else { 
       mDataItems = list; 
      } 

      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      FilterResults results = new FilterResults(); 
      if (constraint == null || constraint.length() == 0) { 

       results.values = mOrigDataItems; 
       results.count = mOrigDataItems.size(); 
      } else { 

       List<T> filter = 
         funDapterFilter.filter(constraint.toString(), mOrigDataItems); 

       results.count = filter.size(); 
       results.values = filter; 

      } 

      return results; 
      } 
     }; 
    } 

    public void resetData() { 
     mDataItems = mOrigDataItems; 
    } 

    } 

我一直在努力爭取這一週,如果你能幫助我,我會非常感激。

+1

檢查這個http://stackoverflow.com/questions/20611123/listview-subobject-clickable-confilct如果它可以幫助 – Raghunandan

+1

@rabhis答案都會很成功(可能是最快的方式來解決你的問題),但Raghunandan的鏈接的答案將是一個更好的方法來做到這一點。 – Gary99

回答

0
holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
    holder.playPause.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

        if (paused) { 
         holder.playPause.setImageResource(R.drawable.ic_pause); 
         paused=false; 
        } 
        else { 
         paused = true; 
         holder.playPause.setImageResource(R.drawable.ic_play); 
        } 

     }}); 

該塊必須同時出現在if和else條件中。現在只有在創建視圖時代碼偵聽器才能正確連接,並且在重用視圖時代碼無法附加偵聽器。

if (v==null) { 
     //that code 
    } else { 
     //that code 
    }