2016-07-15 4 views
0

Я работаю над приложением, которое отобразит список пакетов с его именем и ценой. Все данные [имя и цена пакета] поступают с сервера. Теперь я просто не хочу отображать те пакеты, у которых есть цена = 0 ...Как остановить элемент списка, отображаемый во время создания списка?

Я написал следующий код в свой метод getview() моего адаптера ...

if(packagelist.get(position).getPrice()==0) 
       { 
        return null; 
       } 

Но возврат null в getview() не работает как сбой приложений. есть ли какое-нибудь решение? Пожалуйста, помогите мне ...

LogCat Выход

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.cakenkeyboard.appoinment, PID: 18099 
    java.lang.NullPointerException 
     at android.widget.AbsListView.obtainView(AbsListView.java:2277) 
     at android.widget.ListView.measureHeightOfChildren(ListView.java:1263) 
     at android.widget.ListView.onMeasure(ListView.java:1175) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:590) 
     at android.view.View.measure(View.java:16514) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16514) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5129) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2305) 
     at android.view.View.measure(View.java:16514) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
     at android.view.Choreographer.doFrame(Choreographer.java:544) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5095) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 
     at dalvik.system.NativeStart.main(Native Method) 

Edit: В моем приложении, каждый пакет имеет две цены. Когда пользователь выбирает конкретную радиообъектуру, я обновляю весь список через метод updateResult() адаптера в соответствии с выбранным радиоблоком. Я сохранил обе цены в одном классе bean.

Это мой класс компонента, который хранит данные конкретного пакета ...

public class PackageData implements Serializable{ 
private int price1,price2; 
private String package_name; 
private int id; 
private boolean isSelected; 

public PackageData(int id, int price1, int price2, String package_name) { 
    this.id = id; 
    this.price1 = price1; 
    this.price2 = price2; 
    this.package_name = package_name; 
    isSelected = false; 
} 

public int getId() 
{ 
    return id; 
} 

public void setId(int id) 
{ 
    this.id = id; 
} 

public int getPrice1() { 
    return price1; 
} 

public void setPrice1(int price1) { 
    this.price1 = price1; 
} 

public int getPrice2() { 
    return price2; 
} 

public void setPrice2(int price2) { 
    this.price2 = price2; 
} 

public String getPackage_name() { 
    return package_name; 
} 

public void setPackage_name(String package_name) { 
    this.package_name = package_name; 
} 



public void setSelectionFlag(boolean isSelected) 
{ 
    this.isSelected = isSelected; 
} 

public boolean getSelectionflag() 
{ 
    return this.isSelected; 
}} 

Это мой пользовательский адаптер ....

public class PackageRowAdapter extends BaseAdapter { 

private Context ctx; 
private LayoutInflater inflater; 
private List<PackageData> packagelist; 
boolean isPrice1; 

public PackageRowAdapter(Context ctx, List<PackageData> packagelist) 
{ 
    this.ctx = ctx; 
    this.packagelist = packagelist; 
    isPrice1 = true; 

} 

public class Viewholder { 

    CheckBox chkbox; 
    TextView lblprice; 

    public Viewholder(View v) 
    { 
     this.chkbox = (CheckBox) v.findViewById(R.id.package_row_chkbox); 
     this.lblprice = (TextView) v.findViewById(R.id.package_row_price); 
    } 
} 

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

@Override 
public Object getItem(int i) { 
    return packagelist.get(i); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 

    // getting package data for the row 
    PackageData currentPackage = packagelist.get(position); 

    TextView lbltitle; 
    Viewholder holder = null; 


    if (inflater == null) { 
     inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 


    if (convertView == null) 
     { 
      convertView = inflater.inflate(R.layout.row_package, parent, false); 

      //Binding UI elements with JAVA Objects.... 
      holder = new Viewholder(convertView); 
      lbltitle = (TextView) convertView.findViewById(R.id.package_row_title); 

      //setting recieved data into UI elements 
      lbltitle.setText(currentPackage.getPackage_name()); 

      holder.chkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        set_Checkbox(view); 

       } 
      }); 


      convertView.setTag(holder); 


     } 
    else 
     { 
      holder = (Viewholder) convertView.getTag(); 
     } 


    holder.chkbox.setChecked(currentPackage.getSelectionflag()); 

    if(isPrice1) 
     { 
      holder.lblprice.setText(currentPackage.getPrice1() + " Rs."); 
      if(packagelist.get(position).getPrice1()==0) 
       { 
        return null; 
       } 
     } 
    else 
     { 
      holder.lblprice.setText(currentPackage.getPrice2() + " Rs."); 
      if(packagelist.get(position).getPrice2()==0) 
      { 
       return null; 
      } 
     } 


    holder.chkbox.setTag(position); 


    return convertView; 

}//End of getView() 

    public void updateResult(Boolean isPrice1) 
    { 
     this.isPrice1 = isPrice1; 

     //Triggers the list update 
     notifyDataSetChanged(); 
    } 

    public void set_Checkbox(View view) 
    { 
     CheckBox v = (CheckBox) view; 

     int temp_position =(Integer)v.getTag(); 
     Log.w("Position Value",""+temp_position + " checked = " + ((CheckBox) view).isChecked()); 

     PackageData temp_package = packagelist.get(temp_position); 

     temp_package.setSelectionFlag(v.isChecked()); 
    }} 
+0

Почему приложение рушится? Опубликовать свой logcat mate – basic

+1

установить видимость ушла и видно из вашего представления в getView – Pavya

+0

при создании списка вы можете игнорировать пакеты, значение которых меньше нуля? –

ответ

0

Вы, вероятно, следует хранить пакеты первых, затем отсортируйте все с помощью 0 и затем отправьте их в список.

+0

благодарю брата ... Я также подумал, что сначала, но в моем приложении у каждого пакета есть две цены. Когда пользователь выбирает конкретную радиообъектуру, я обновляю весь список через метод updateResult() адаптера .... что, если цена2 не равна 0, а price1 равна 0 этого пакета? он не будет отображаться .... это не обязательно ... – Intimate

1
ArrayList packageList; 
ArrayList newList; 

for(int position=0; position <packageList.size() ; position) 
{ 
if(packagelist.get(position).getPrice()!=0) 
newList.add(packagelist.get(position));  
// new list will not contain PRICE==0 

} 

передать новый список в listview вместо packageList. Я думаю, что это сработает.

+0

это оставит пустой вид, который занимает бесполезное пространство. –

+0

, если я верну свое представление ... тогда он отобразит представление в списке. я хочу, чтобы представление не отображалось, а не отображалось пустое представление ... tnx bydway ... – Intimate

+0

@ WadeWilson, да были правы, попробуйте этот новый код, он будет работать – Shivam

0

Непосредственно перед перевалом ListView Создать один новый список и хранить только данные, имеющие значение> 0, а затем передать этот список в ListView

0
if(packagelist.get(position).getPrice()!=0) 
      { 
       textView.setText(""+ packagelist.get(position).getPrice()) // or any code you want when PRICE!=0 
      } 
else{ 
textView.setText(""); // Or any other value you want to display when value is 0 
} 

try this 
0

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

Update:

другое решение было бы добавить элементы, которые вы не хотите, показали, если при особых обстоятельствах в самом конце списка, и сохранить ссылку на индекс всегда отображаемых пунктов и отображение в особых случаях предметы. Следует отметить, что для этого требуется особая осторожность при сохранении переменных счетчика в синхронизации и имеет эффект, препятствующий отображению ваших товаров в пользовательском порядке, то есть ничего, кроме всегда отображаемых предметов и особых обстоятельств; по крайней мере, без специальной логики сортировки.

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