【问题标题】:Problems with listView in androidandroid中listView的问题
【发布时间】:2015-01-12 09:28:40
【问题描述】:

我有 2 或 3 个孩子的列表视图。我正在从数据库中获取孩子。我得到了孩子,但是当我想调用由 updateOdgovor() 中的空指针异常引起的 updateOdgovor() 方法时,我得到空指针异常。如果我在单击其中一个按钮后调用方法 updateOdgovor(),则不会出现空指针异常 这是我的主要代码

public class PitanjeActivity extends Activity implements OnClickListener {
private Animator mCurrentAnimator;
private int mShortAnimationDuration;
private ArrayList<Pitanja> getAllPitanja;
private ArrayList<Pitanje_has_Slika> getAllImages;
private ArrayList<Odgovor> odgovorList;
private HashMap<Integer, List<Integer>> odgBrojPitanja;
private List<Integer> kliknuti;
private DBTools db = new DBTools(this);
private Intent intent;
int broj = 0;
private ImageView previous, informacije, odgovori, next, textSlike;
private TextView brojPitanja, kategorijaPitanja, textPitanja;
private String info;
private ListView listView;
boolean odgovoreno;
private ListView mDrawerList;
private RelativeLayout rightRL;
private DrawerLayout drawerLayout;
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavigationItem> navDrawerItems;
private NavigationListAdapter adapte;
private Bitmap bmp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_pitanje);

    informacije = (ImageView) findViewById(R.id.informacijeButton);
    odgovori = (ImageView) findViewById(R.id.odgovoriButton);
    next = (ImageView) findViewById(R.id.nextButton);
    textSlike = (ImageView) findViewById(R.id.imageSlikaImageView);
    brojPitanja = (TextView) findViewById(R.id.brojPitanjaTextViewPitanjeActivity);
    textPitanja = (TextView) findViewById(R.id.textPitanjaTextViewPitanjaActivity);
    previous.setOnClickListener(this);
    informacije.setOnClickListener(this);
    odgovori.setOnClickListener(this);
    next.setOnClickListener(this);

    getAllPitanja = db
            .getAllPitanja(intent.getStringExtra("id_kategorije"));
    getAllImages = db.getAllPitanjaImages();

    updateDisplay(broj);

}

@SuppressLint("SdCardPath")
private void updateDisplay(int z) {

    odgovorList = db.getAllOdgovore(Integer.toString(getAllPitanja.get(z)
            .getIdPitanja()));
    Collections.shuffle(odgovorList);
    PitanjaAdapter adapter = new PitanjaAdapter(this,
            R.layout.pitanja_entry, odgovorList);
    listView = (ListView) findViewById(R.id.listView);
    listView.setAdapter(adapter);
    Log.i("Pitanje je sljedece", getAllPitanja.get(z).getTextPitanja());
    Log.i("Odgovori su sljedeci", odgovorList.get(0).getContents() + "; ;" + odgovorList.get(1).getContents());
    updateOdgovor(z);

}

@Override
public void onClick(View view) {
    switch (view.getId()) {

    case R.id.previousButton:
        odgovoreno = check();
        if (odgovoreno) {
            updateOdgovor(broj);
            set();
        } else {
            broj--;
            if (broj < 0) {
                broj = getAllPitanja.size() - 1;
            }
            updateDisplay(broj);
            if (checkList(broj)){
                checList(broj);
            } else {
                Log.i("Vrijednosti ne postoji", "Ne postoji");
            }
        }
        break;

    case R.id.informacijeButton:
        Intent intent = new Intent(getApplicationContext(),
                InformacijeActivity.class);
        intent.putExtra("Informacije", info);
        intent.putExtra("naslov",
                String.valueOf(getAllPitanja.get(broj).getTextPitanja()));
        startActivity(intent);
        break;

    case R.id.odgovoriButton:
        updateOdgovor(broj);
        set();
        break;

    case R.id.nextButton:
        odgovoreno = check();
        if (odgovoreno) {
            updateOdgovor(broj);
            set();
        } else {
            broj++;
            if (broj > (getAllPitanja.size() - 1)) {
                broj = 0;
            }
            updateDisplay(broj);
            if (checkList(broj)){
                checList(broj);
            } else {
                Log.i("Vrijednosti ne postoji", "Ne postoji");
            }
        }

        break;

    }
}
private void updateOdgovor(int z) {

    kliknuti = new ArrayList<>();
    Log.i("Ulazim u updateOdgovor", "UpdateOdgovor");
    for (int i = 0; i < odgovorList.size(); i++) {
        Log.i("Ulazim u for petlju", "UpdateOdgovor");
        Odgovor odgovor = odgovorList.get(i);
        Log.i("Definiram odgovorr", "UpdateOdgovor");
        if (Integer.parseInt(odgovor.getIs_correct()) == 1) {
            Log.i("Ulazim u prvi if", "UpdateOdgovor");
            listView.getChildAt(i)
                    .findViewById(R.id.code)
                    .setBackgroundResource(
                            R.drawable.tocan_odgovor_drawable);
            Log.i("Izlazim iz prvog if-a", "UpdateOdgovor");
        } else {
            Log.i("Ulazim u prvi else", "UpdateOdgovor");
            listView.getChildAt(i)
                    .findViewById(R.id.code)
                    .setBackgroundResource(
                            R.drawable.netocan_odgovor_drawable);
            Log.i("Izlzim iz elsa", "UpdateOdgovor");
        }
        if (Integer.parseInt(odgovor.getIs_correct()) == 1
                && odgovor.isSelected()) {
            Log.i("Ulazim u drugi if", "UpdateOdgovor");
            listView.getChildAt(i).findViewById(R.id.checkBox1)
                    .setBackgroundResource(R.drawable.ikona_box2_tocno);
            Log.i("Zavrsavam drugi if", "UpdateOdgovor");
        } else if (Integer.parseInt(odgovor.getIs_correct()) != 1
                && odgovor.isSelected()) {
            Log.i("Ulazim u else if", "UpdateOdgovor");
            listView.getChildAt(i).findViewById(R.id.checkBox1)
                    .setBackgroundResource(R.drawable.ikona_box2_netocno);
            Log.i("Zavrsavam else if", "UpdateOdgovor");
        }
        if (odgovor.isSelected()){
            Log.i("Ulazim u treci if", "UpdateOdgovor");
            kliknuti.add(odgovor.getId());
            Log.i("Zavrsavam treci if", "UpdateOdgovor");
        }
        odgovoreno = false;
        Log.i("Zavrsavam s forom", "UpdateOdgovor");

    }
    odgBrojPitanja.put(z, kliknuti);
    Log.i("Pitanje na koje ste odgovorili", odgBrojPitanja.toString());

}

因为有人问我布局,我会在这里发布我的布局 我的主要布局:

 <RelativeLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#878787" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true"
        android:layout_marginBottom="10dp"
        android:background="#535351"
        android:weightSum="100" >

        <TextView
            android:id="@+id/kategorijaTextViewPitanjeActivity"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="70"
            android:gravity="center"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#A7A7A5" />

        <TextView
            android:id="@+id/brojPitanjaTextViewPitanjeActivity"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="15"
            android:gravity="center"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#FFAD00" />

        <ImageView
            android:id="@+id/glavniIzbornikPitanjaImageView"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="15"
            android:clickable="true"
            android:contentDescription="@string/glavni_izbornik_image_view"
            android:onClick="onRight"
            android:src="@drawable/ikona_glavni_izbornik_01" />
    </LinearLayout>

    <TextView
        android:id="@+id/textPitanjaTextViewPitanjaActivity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linearLayout1"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginStart="20dp"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="#FFFFFF" />

    <ImageView
        android:id="@+id/expanded_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/imageview_pitanja_ispiti"
        android:contentDescription="@string/autoskola_imageView"
        android:focusable="true"
        android:foregroundGravity="center"
        android:visibility="gone" />

    <LinearLayout
        android:id="@+id/linearLayout3"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignLeft="@+id/textPitanjaTextViewPitanjaActivity"
        android:layout_alignStart="@+id/textPitanjaTextViewPitanjaActivity"
        android:layout_below="@+id/textPitanjaTextViewPitanjaActivity"
        android:layout_marginEnd="20dp"
        android:layout_above="@+id/linearLayout4"
        android:layout_marginRight="20dp"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/imageSlikaImageView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="?android:attr/actionBarSize"
            android:layout_weight="1"
            android:contentDescription="@string/autoskola_imageView"
            android:paddingEnd="15dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingStart="15dp"
            android:visibility="gone" />

        <ListView
            android:id="@+id/listView"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center"
            android:divider="@null" >
        </ListView>
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/linearLayout4"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"
        android:weightSum="100" >

        <ImageView
            android:id="@+id/previousButton"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_marginBottom="-5dp"
            android:layout_marginEnd="-7dp"
            android:layout_marginLeft="-7dp"
            android:layout_marginRight="-7dp"
            android:layout_marginStart="-7dp"
            android:contentDescription="@string/autoskola_imageView"
            android:src="@drawable/ikona_lijevo" />

        <ImageView
            android:id="@+id/nextButton"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginBottom="-5dp"
            android:layout_marginEnd="-7dp"
            android:layout_marginLeft="-7dp"
            android:layout_marginRight="-7dp"
            android:layout_marginStart="-7dp"
            android:contentDescription="@string/autoskola_imageView"
            android:src="@drawable/ikona_desno" />

        <ImageView
            android:id="@+id/informacijeButton"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="85dp"
            android:layout_marginStart="85dp"
            android:layout_toEndOf="@+id/previousButton"
            android:layout_toRightOf="@+id/previousButton"
            android:contentDescription="@string/autoskola_imageView"
            android:paddingTop="8dp"
            android:src="@drawable/ikona_informacije" />

        <ImageView
            android:id="@+id/odgovoriButton"
            android:layout_width="150dp"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginEnd="65dp"
            android:layout_marginLeft="54dp"
            android:layout_marginRight="65dp"
            android:layout_marginStart="54dp"
            android:layout_toEndOf="@+id/informacijeButton"
            android:layout_toLeftOf="@+id/nextButton"
            android:layout_toRightOf="@+id/informacijeButton"
            android:layout_toStartOf="@+id/nextButton"
            android:contentDescription="@string/autoskola_imageView"
            android:paddingTop="8dp"
            android:src="@drawable/ikona_odgovori" />
    </RelativeLayout>
</RelativeLayout>

<RelativeLayout
    android:id="@+id/whatYouWantInRightDrawerPitanja"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="end"
    android:layout_marginTop="?android:attr/actionBarSize" >

    <ListView
        android:id="@+id/listaDesnoPitanja"
        android:layout_width="200dp"
        android:layout_height="match_parent"
        android:background="#535351" />
</RelativeLayout>

这是我在列表视图中的儿童布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<CheckBox
    android:id="@+id/checkBox1"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_marginEnd="10dp"
    android:layout_marginRight="10dp"
    android:layout_marginBottom="2dp"
    android:layout_marginTop="2dp"
    android:layout_gravity="center"
    android:button="@null"
    android:background="@drawable/selector_check" />

<TextView
    android:id="@+id/code"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/button_drawable"
    android:layout_marginBottom="2dp"
    android:layout_marginTop="2dp"
    android:padding="5dp"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#FFFFFF" />

</LinearLayout>

这是我的日志

   01-12 10:51:14.148: E/AndroidRuntime(1471): FATAL EXCEPTION: main
   01-12 10:51:14.148: E/AndroidRuntime(1471): java.lang.RuntimeException: Unable to start        activity ComponentInfo{com.prolink.autoskola/com.prolink.autoskola.PitanjeActivity}: java.lang.NullPointerException
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread.access$700(ActivityThread.java:140)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.os.Handler.dispatchMessage(Handler.java:99)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.os.Looper.loop(Looper.java:137)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread.main(ActivityThread.java:4921)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at java.lang.reflect.Method.invokeNative(Native Method)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at java.lang.reflect.Method.invoke(Method.java:511)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at dalvik.system.NativeStart.main(Native Method)
   01-12 10:51:14.148: E/AndroidRuntime(1471): Caused by: java.lang.NullPointerException
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at com.prolink.autoskola.PitanjeActivity.updateOdgovor(PitanjeActivity.java:361)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at com.prolink.autoskola.PitanjeActivity.updateDisplay(PitanjeActivity.java:219)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at com.prolink.autoskola.PitanjeActivity.onCreate(PitanjeActivity.java:143)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.Activity.performCreate(Activity.java:5206)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
   01-12 10:51:14.148: E/AndroidRuntime(1471):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)

问题是当我尝试在列表视图中更改孩子的背景时。问题不在arrayList中

【问题讨论】:

  • 问题的描述比较混乱,能不能说的清楚点.??.. 还要上传logcat。
  • 能否请您发送您的 logcat 输出?
  • 发送准确的错误堆栈跟踪
  • 我发布了一个 logcat。问题是当我尝试在列表视图中更改孩子的背景时。
  • 看看我的更新。如果您将您的编辑放在原始问题中而不是将其作为答案发布,那会更好,有些人会对此投反对票

标签: android listview android-activity android-arrayadapter


【解决方案1】:

可能的错误:你的哈希图

    HashMap<Integer, List<Integer>> odgBrojPitanja 

未初始化。如果这不是问题,请向我们展示 logcat 输出。但是绝对HashMap是无效的。

更新

这里的问题是,您试图在 listView 中访问不可见的子项,因此如果 getChildAt() 是不可见的,则 getChildAt() 将返回 null。我不知道这是否能解决您的问题,但有一个技巧。试试:

      listView.getChildAt(i -listView.getFirstVisiblePosition()).findViewById(R.id.code).setBackgroundResource(
                        R.drawable.tocan_odgovor_drawable);

在任何地方执行此操作您想对 listViews 子项执行操作。

【讨论】:

  • 我在oncreate方法中初始化了,但我不想把所有的代码都放上去,因为它会占用太多空间。当我想在列表视图中更改子项的背景资源时,问题出在 updateOdgovor() 方法中。我发了一个logcat,看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多