2017-02-11 3 views
3

У меня есть представление List, что я заполняю строки через базу данных mysql.Найти позицию изображения в списке listview

Это мнение о том, что я сделал:

enter image description here

Это имена, которые ты видел, приходящие из моей базы данных и ВОСПРОИЗВЕДЕНИЯ 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 ответа, скорее всего, работать (и может быть самым быстрым способом решить вашу проблему), но ответ в ссылке Рагхунандана был бы лучшим способом сделать это. – 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, так и в противном случае. Теперь слушатели правильно привязаны только тогда, когда создается представление, и код не может подключить слушателей, когда просмотр используется повторно.

if (v==null) { 
     //that code 
    } else { 
     //that code 
    } 
Смежные вопросы