2017-01-03 3 views
2

Когда я пытаюсь нажать на EditText внутри ListView item. Он получает фокус и теряет фокус, а при отладке я обнаружил, что если бы я нажал на 21-й элемент, значение позиции изменилось как 21, 19, 1, 2 и т. Д. Не уверен, что список перерисовывает себя или что-то еще происходит. Я уже много раз искал и уже опробовал настройку ListView (beforeDescendants и afterDescendants) и Activity (adjustPan).Фокус на неправильном редактировании текста внутри listview

Я использовал свой пользовательский адаптер. Совместно используем файл XMLListView и элемент списка вместе с кодом java адаптера.

список XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:padding="10dp"> 

    <!-- submit progress --> 
    <ProgressBar 
     android:id="@+id/list_progress" 
     style="?android:attr/progressBarStyleLarge" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="8dp" 
     android:visibility="gone"/> 

    <LinearLayout 
     android:id="@+id/list_form" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginTop="20dp"> 
     <TextView 
      android:id="@+id/nodata_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="No data Found" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_gravity="center_horizontal" 
      android:textSize="20sp" 
      android:visibility="gone"/> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/info_ll" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:gravity="center_horizontal"> 
     <Button 
      android:id="@+id/send_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Create Order" 
      android:textSize="14sp" 
      android:paddingLeft="10dp" 
      android:paddingRight="10dp" 
      android:layout_weight="1" 
      android:textColor="@android:color/white" 
      android:background="@drawable/bg_button"/> 


    </LinearLayout> 
    <LinearLayout 
     android:id="@+id/ly_item_list_form" 
     android:layout_below="@+id/info_ll" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical"> 
     <ListView 
      android:id="@+id/item_list_view" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:descendantFocusability="afterDescendants"/> 
    </LinearLayout> 

</RelativeLayout> 

XML из list_item_selector

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    android:id="@+id/card_view" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="2dp" 
    android:layout_marginRight="2dp" 
    android:foreground="?android:attr/selectableItemBackground" 
    card_view:cardCornerRadius="5dp" 
    card_view:cardElevation="2dp" 
    card_view:cardPreventCornerOverlap="true" 
    card_view:cardUseCompatPadding="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/item_name" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_margin="10dp" 
      android:text="ItemName" 
      android:textColor="@color/colorPrimaryDark" 
      android:textSize="15sp" 
      android:textStyle="bold"/> 

     <RelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="1dp" 
      android:layout_marginEnd="10dp" 
      android:layout_marginStart="10dp" 
      android:background="#FF0B38CC"></RelativeLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_marginTop="1dp" 
      android:orientation="horizontal"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:layout_weight="1" 
       android:orientation="vertical"> 

       <TextView 
        android:id="@+id/uom_desc" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:layout_marginStart="10dp" 
        android:text="uom" 
        android:textColor="@color/colorPrimary" 
        android:textSize="13sp" 
        /> 

      </LinearLayout> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_weight="1.1" 
       > 

       <LinearLayout 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:layout_margin="5dp" 
        android:orientation="horizontal"> 

        <ImageButton 
         android:id="@+id/button_minus" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_gravity="center_vertical" 
         android:layout_weight="1" 
         android:background="@null" 
         android:src="@drawable/ic_remove_black_24dp"/> 

        <EditText 
         android:id="@+id/number_of_item" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_weight="0.7" 
         android:gravity="center" 
         android:text="0" 
         android:digits="" 
         android:maxLength="4" 
         android:inputType="number" 
         android:textColor="@color/colorPrimary"/> 

        <ImageButton 
         android:id="@+id/button_plus" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:layout_gravity="center_vertical" 
         android:layout_weight="1" 
         android:background="@null" 
         android:src="@drawable/ic_add_black_24dp"/> 
       </LinearLayout> 
      </RelativeLayout> 
     </LinearLayout> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

Мой класс пользовательский адаптер

public class OrderViewListAdapter extends ArrayAdapter<OrderItemList> { 

public OrderViewListAdapter(Context context, int resource) { 
    super(context, resource); 
} 

private class ViewHolder { 
    TextView sku_desc; 
    TextView uom_desc; 
    EditText order_qty; 
    ImageButton plus; 
    ImageButton minus; 
    AutoCompleteTextView uom; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // Get the data item for this position 
    OrderItemList vehicleTransit = mDataSet.get(position); 
    //System.out.println("kamal123" +mDataSet.get(position).getOrderID()); 
    System.out.println("kamal123" +position); 
    ViewHolder viewHolder; 

    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.list_item_selector, parent, false); 
     viewHolder.sku_desc = (TextView) convertView.findViewById(R.id 
       .item_name); 
     viewHolder.uom_desc = (TextView) convertView.findViewById(R.id 
       .uom_desc); 
     viewHolder.order_qty = (EditText) convertView.findViewById(R.id.number_of_item); 
     viewHolder.plus= (ImageButton)convertView.findViewById(R.id.button_plus) ; 
     viewHolder.minus= (ImageButton)convertView.findViewById(R.id.button_minus) ; 
     convertView.setTag(viewHolder); 
     viewHolder.plus.setTag(viewHolder); 
     viewHolder.minus.setTag(viewHolder); 
     viewHolder.order_qty.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    if(vehicleTransit!= null) { 
     System.out.println("kamal123" + vehicleTransit.getExpectedDeliveryDate() 
       .toString()); 


     if (vehicleTransit.getExpectedDeliveryDate() != null) { 
      viewHolder.uom_desc.setText(vehicleTransit.getUOMDesc() 
        .toString()); 
      System.out.println("kamal123" +vehicleTransit.getExpectedDeliveryDate() 
        .toString()); 

     }if (vehicleTransit.getSkuDesc() != null) { 
      viewHolder.sku_desc.setText(vehicleTransit.getSkuDesc().toString()); 
     } 
      viewHolder.order_qty.setText(vehicleTransit.getOrderQty()+""); 
      viewHolder.order_qty.setId(position); 
    } 



    viewHolder.plus.setOnClickListener(new View.OnClickListener() { 


     int count=0; 

     @Override 
     public void onClick(View v) { 
      View p = (View) v.getParent(); 
      ViewHolder holder1 = (ViewHolder) v.getTag(); 
      count = Integer.valueOf(holder1.order_qty.getText().toString()); 
      count++; 
      holder1.order_qty.setText(String.valueOf(count)); 
      mDataSet.get(position).setOrderQty(count); 
      //mAdapter.notifyDataSetChanged(); 
     } 

    }); 



    viewHolder.minus.setOnClickListener(new View.OnClickListener() { 


     int count=0; 

     @Override 
     public void onClick(View v) { 
      View p = (View) v.getParent(); 
      ViewHolder holder1 = (ViewHolder) v.getTag(); 
      count = Integer.valueOf(holder1.order_qty.getText().toString()); 
      count--; 
      if(count>=0) 
      {holder1.order_qty.setText(String.valueOf(count)); 
      mDataSet.get(position).setOrderQty(count); 
      //mAdapter.notifyDataSetChanged(); 
      } 

     } 

    }); 





    //we need to update adapter once we finish with editing 
    viewHolder.order_qty.setOnFocusChangeListener(new View.OnFocusChangeListener() { 

     int count=0; 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (!hasFocus){ 
       View p = (View) v.getParent(); 
       ViewHolder holder1 = (ViewHolder) v.getTag(); 
       final int position = holder1.order_qty.getId(); 
       count = Integer.valueOf(holder1.order_qty.getText().toString()); 
       if(count>0) 
       {holder1.order_qty.setText(String.valueOf(count)); 
        mDataSet.get(position).setOrderQty(count); 
        //mAdapter.notifyDataSetChanged(); 
       } 





      } 
     } 
    }); 


    /*viewHolder.order_qty.addTextChangedListener(new TextWatcher() { 

     int count=0; 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
             int after) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 
      count = Integer.valueOf(s.toString()); 
      mDataSet.get(position).setOrderQty(count); 

     } 
    });*/ 


    return convertView; 
} 

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

Спасибо заранее.

ответ

0

Наконец, я понял это. проблема заключалась в том, чтобы решить get tex изменить значение внутри getview. Это было повторное рендеринг элементов списка, и я получал неправильный фокус и отличался странным поведением. Я создал класс textwatcher и добавил его при инициализации объекта, чтобы он не влиял каждый раз на каждый элемент в списке. Ниже приведен код для MyCustom адаптера

public class OrderViewListAdapter extends ArrayAdapter<OrderItemList> { 

    public OrderViewListAdapter(Context context, int resource) { 
     super(context, resource); 
    } 

    private class ViewHolder { 
     TextView sku_desc; 
     TextView uom_desc; 
     EditText order_qty; 
     ImageButton plus; 
     ImageButton minus; 
     AutoCompleteTextView uom; 
     MyCustomEditTextListener myCustomEditTextListener; 

     public ViewHolder(View convertView, MyCustomEditTextListener myCustomEditTextListener) { 
      this.myCustomEditTextListener = myCustomEditTextListener; 
      this.order_qty = (EditText) convertView.findViewById(R.id.number_of_item); 
      this.order_qty.addTextChangedListener(myCustomEditTextListener); 

     } 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     OrderItemList vehicleTransit = mDataSet.get(position); 
     //System.out.println("kamal123" +mDataSet.get(position).getOrderID()); 
     System.out.println("kamal123" +position); 
     ViewHolder viewHolder; 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.list_item_selector, parent, false); 
      viewHolder = new ViewHolder(convertView, new MyCustomEditTextListener()); 
      viewHolder.sku_desc = (TextView) convertView.findViewById(R.id 
        .item_name); 
      viewHolder.uom_desc = (TextView) convertView.findViewById(R.id 
        .uom_desc); 
      viewHolder.order_qty = (EditText) convertView.findViewById(R.id.number_of_item); 
      viewHolder.plus= (ImageButton)convertView.findViewById(R.id.button_plus) ; 
      viewHolder.minus= (ImageButton)convertView.findViewById(R.id.button_minus) ; 
      convertView.setTag(viewHolder); 
      viewHolder.plus.setTag(viewHolder); 
      viewHolder.minus.setTag(viewHolder); 
      viewHolder.order_qty.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     if(vehicleTransit!= null) { 
      System.out.println("kamal123" + vehicleTransit.getExpectedDeliveryDate() 
        .toString()); 


      if (vehicleTransit.getExpectedDeliveryDate() != null) { 
       viewHolder.uom_desc.setText(vehicleTransit.getUOMDesc() 
         .toString()); 
       System.out.println("kamal123" +vehicleTransit.getExpectedDeliveryDate() 
         .toString()); 

      }if (vehicleTransit.getSkuDesc() != null) { 
       viewHolder.sku_desc.setText(vehicleTransit.getSkuDesc().toString()); 
      } 

      viewHolder.myCustomEditTextListener.updatePosition(position); 
      viewHolder.order_qty.setText(vehicleTransit.getOrderQty()+""); 
       viewHolder.order_qty.setId(position); 

     } 



     viewHolder.plus.setOnClickListener(new View.OnClickListener() { 


      int count=0; 

      @Override 
      public void onClick(View v) { 
       View p = (View) v.getParent(); 
       ViewHolder holder1 = (ViewHolder) v.getTag(); 
       count = Integer.valueOf(holder1.order_qty.getText().toString()); 
       count++; 
       holder1.order_qty.setText(String.valueOf(count)); 
       mDataSet.get(position).setOrderQty(count); 
       //mAdapter.notifyDataSetChanged(); 
      } 

     }); 



     viewHolder.minus.setOnClickListener(new View.OnClickListener() { 


      int count=0; 

      @Override 
      public void onClick(View v) { 
       View p = (View) v.getParent(); 
       ViewHolder holder1 = (ViewHolder) v.getTag(); 
       count = Integer.valueOf(holder1.order_qty.getText().toString()); 
       count--; 
       if(count>=0) 
       {holder1.order_qty.setText(String.valueOf(count)); 
       mDataSet.get(position).setOrderQty(count); 
       //mAdapter.notifyDataSetChanged(); 
       } 

      } 

     }); 



     return convertView; 
    } 



    private class MyCustomEditTextListener implements TextWatcher { 
     private int position; 

     public void updatePosition(int position) { 
      this.position = position; 
     } 

     @Override 
     public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      // no op 
     } 

     @Override 
     public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { 
      if (!charSequence.toString().equals("")) { 
       mDataSet.get(position).setOrderQty(Integer.valueOf(charSequence.toString())); 
      } else { 
       mDataSet.get(position).setOrderQty(0); 
      } 

     } 

     @Override 
     public void afterTextChanged(Editable editable) { 
      // no op 
     } 
    } 



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

Вставьте эту строку в onCreate перед тем setContentView()

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST); 

Это, безусловно, поможет вам

+0

Я применил свой код предложили в моем приложении, производительность улучшилась, но иногда это еще не позволяя текст внутри окна редактирования, чтобы изменить, когда я ввести значение. –

+0

ранее мой код позволял мне вводить значение в один или два текста редактирования из 30-40 элементов списка, теперь он позволяет мне вводить значение в большинстве текстов редактирования, но когда я просматриваю вверх и вниз и пытаюсь ввести значение в некоторых случайный текст редактирования, один или два раза значение не отражает. –

Смежные вопросы