2014-02-26 3 views
0

목록보기에서 항목을 강조 표시하려고하므로 사용자가 listview에서 항목을 클릭하면 새로운 활동이 시작되고 listview의 특정 항목이 강조 표시됩니다.Android에서 목록보기의 항목을 강조 표시 할 수 없습니다.

나는 이것이 조각으로 할 수 있다는 것을 알고 있지만 필자는 활동을 더 쉽게하기 때문에 활동을 선호한다.

1559-1559/com.example.listviewandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.listviewandroid, PID: 1559 
    java.lang.NullPointerException 
      at android.widget.AbsListView.obtainView(AbsListView.java:2265) 
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1263) 
      at android.widget.ListView.onMeasure(ListView.java:1175) 
      at android.view.View.measure(View.java:16458) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      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:16458) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      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:16458) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:16458) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327) 
      at android.view.View.measure(View.java:16458) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2289) 
      at android.view.View.measure(View.java:16458) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1914) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1111) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1293) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5582) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
      at android.view.Choreographer.doFrame(Choreographer.java:532) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4998) 
      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:777) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
      at dalvik.system.NativeStart.main(Native Method) 

내가 노력하고 있어요 - 그래서 여기

은 여기 내 item_layout.xml 이것은 슬로우 된 예외

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

    <TextView 
     android:id="@+id/itemName" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentLeft="true" /> 


</RelativeLayout> 

있는 사용자 정의 어댑터

public class CustomAdapter extends BaseAdapter{ 

    Context mycontext; 
    ArrayList<String> contactsList; 
    LayoutInflater minflater; 

    public CustomAdapter(Context context, ArrayList<String> list) 
    { 
     this.mycontext=context; 
     contactsList=list; 
     minflater =LayoutInflater.from(context); 

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


    @Override 
    public Object getItem(int position) 
    { 
     return contactsList.get(position); 
    } 


    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 


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

     if (convertView !=null) 
     { 
      LayoutInflater inflater=(LayoutInflater) mycontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v =inflater.inflate(R.layout.item_layout,null); 

      TextView tv=(TextView)v.findViewById(R.id.itemName); 

      if (position ==1) 
      { 
       convertView.setBackgroundColor(Color.BLUE); 

      } 
     } 
     return convertView; 
    } 
} 

입니다 item_lauout을 부풀리고 listview 위치 색인이 1이면 파란색으로 textview를 강조 표시합니다. 여기서 내가 뭘 잘못하고있는가.

편집 2 :

1810-1810/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.listviewandroid, PID: 1810 
    java.lang.NullPointerException 
      at android.widget.AbsListView.obtainView(AbsListView.java:2265) 
      at android.widget.ListView.measureHeightOfChildren(ListView.java:1263) 
      at android.widget.ListView.onMeasure(ListView.java:1175) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      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:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      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:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916) 
      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670) 
      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:5017) 
      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:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 

편집 3 : 주요 활동 코드

package com.example.listviewandroid; 

import android.content.Intent; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

import android.text.format.Time; 
import java.util.Date; 

public class MainActivity extends Activity { 
    ListView listView ; 
    static final String STE = ""; 
    static final String STM = ""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (savedInstanceState !=null) 
     { 
      restoreState(savedInstanceState); 
     } 
     listView = (ListView) findViewById(R.id.listView); 

     TextView textviewmenu= (TextView) findViewById(R.id.textViewMenu); 
     textviewmenu.setBackgroundColor(Color.rgb(89,89,89)); 
     textviewmenu.setTextColor(Color.WHITE); 

     String[] values = getResources().getStringArray(R.array.menuList); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, values); 


     // Assign adapter to ListView 
     listView.setAdapter(adapter); 

     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 

       // ListView Clicked item index 
       int itemPosition  = position; 

       // ListView Clicked item value 
       String itemValue = (String) listView.getItemAtPosition(position); 


       // Show Alert 

       switch(position) 
       { 

        case 1: Intent newActivity = new Intent(MainActivity.this,Activity2.class); 
         startActivity(newActivity); 
         break; 

        case 2: Intent newActivity1 = new Intent(MainActivity.this,Activity3.class); 
         startActivity(newActivity1); 
         break; 
        case 3: Intent newActivity2 = new Intent(MainActivity.this,Activity4.class); 
         startActivity(newActivity2); 
         break; 
        case 4: Intent newActivity3 = new Intent(MainActivity.this,Activity5.class); 
         startActivity(newActivity3); 
         break; 
        case 5: Intent newActivity4 = new Intent(MainActivity.this,Activity6.class); 
         startActivity(newActivity4); 
         break; 

       } 
       Toast.makeText(getApplicationContext(), 
         "Position :"+itemPosition+" ListItem : " +itemValue , Toast.LENGTH_LONG) 
         .show(); 

      } 

     }); 
     Time now = new Time(); 
     now.setToNow(); 
     if (savedInstanceState ==null) 
     { 
     TextView textview2= (TextView)findViewById(R.id.MAtextView2); 
     textview2.setText(now.hour+" : "+now.minute); 
     } 


    } 


    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 


     TextView startimetext= (TextView) findViewById(R.id.MAtextView2); 
     outState.putString(STE,startimetext.getText().toString()); 



     TextView endtimetext= (TextView) findViewById(R.id.MAtextView3); 
     outState.putString(STM,startimetext.getText().toString()); 


    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public void SetEndTime(View view) { 
     Time now = new Time(); 
     now.setToNow(); 
     TextView textview3= (TextView)findViewById(R.id.MAtextView3); 
     textview3.setText(now.hour+" : "+now.minute); 

    } 

    public void NextActivity(View view) { 
     Intent myIntent = new Intent(MainActivity.this,Activity2.class); 
     MainActivity.this.startActivity(myIntent); 
     this.overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right); 

    } 

    private void restoreState(Bundle savedInstanceState) { 
     TextView startimetext= (TextView) findViewById(R.id.MAtextView2); 

     TextView endtimetext= (TextView) findViewById(R.id.MAtextView3); 


     startimetext.setText(savedInstanceState.getString(STE)); 
     endtimetext.setText(savedInstanceState.getString(STM)); 



    } 
} 
+0

내 대답이 변경되었습니다. 그것은 지금 작동하는 것 .. .. 만약 당신을 위해, 내 대답을 받아주세요 .. :) – mike20132013

+0

나는 당신의 코드를 통과했다.새로운 활동이 시작될 때마다 동일한 목록보기를 설정하는 것처럼 보입니다. 첫 번째 문제는 응용 프로그램에 너무 많은 부하가 걸리고 너무 많은 메모리가 손실된다는 것입니다. 파편을 사용하지 않으려는 ur를 알고 있지만 파편을 사용하면 실제로 작업이 더 쉬워집니다. – mike20132013

+0

@ mike20132013 파편으로 옮기기 전에 다음 2 일간 quickfix를 사용합니다. –

답변

1

()을 당신의 getView에서 :.

첫째 : 어댑터에서 이러한 것들을 정의 :

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

    if (convertView == null) { 

       LayoutInflater inflater = (LayoutInflater) context 
         .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.item_layout, null); 
      } 
       TextView tv=(TextView)convertView .findViewById(R.id.itemName); 

       try { 

      if(position ==1){ 

       convertView.setBackgroundColor(Color.GREEN); 
      } 


     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 


return convertView; 

} 

선택한 항목을 유지하려면

getView()에 다음 행을 추가하십시오.

if(selectedIndex!= -1 && position == selectedIndex) 
     { 
      txtTitle.setBackgroundColor(Color.BLACK); 
     } 
     else 
     { 
      txtTitle.setBackgroundColor(selectedColor); 
     } 

이제 작동합니다 .. :)

+0

가 작동하지 않습니다. 로그는 내 게시물의 편집 2에 있습니다. –

+0

이 어댑터를 사용하려는 주요 활동 코드도 제공 할 수 있습니까? 어댑터가 나에게 잘 보이기 때문에. – mike20132013

+0

, 방금 주 활동 코드를 추가했습니다 –

0
  1. 변경 if (convertView !=null)if (convertView ==null)하는 재사용 할 수있는 뷰가없는 경우 레이아웃을 팽창 할 필요가있다.
  2. 특정 행/목록 항목을 강조 표시하려면 목록 수신기에 클릭 수신기를 추가해야합니다. 클릭 리스너를 추가하는 방법은 다음과 같습니다. 보기을 업데이트하여 강조 표시하십시오.

    lv.setOnItemClickListener(new OnItemClickListener() {

    @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position, 
          long id) { 
         Intent intent = new Intent(MainActivity.this, SendMessage.class); 
         String message = "abc"; 
         intent.putExtra(EXTRA_MESSAGE, message); 
         startActivity(intent); 
        } 
    }); 
    
  3. 당신은 변수 V에 팽창보기를 설정하고 convertView를 반환하는

    . convertView 또는 반환 V에 V를 할당하십시오

+0

여전히 작동하지 않지만 같은 오류로 인해 충돌합니다. –

0

를 당신이 익명의 클래스 내부 목록보기를 사용 두지 생각합니다. 을 사용해야합니다. AdapterView arg0

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long id) { 
      AnyObject obj=(AnyObject)arg0.getItemAtPosition(position); 

          ........ 
          ......... 
          ......... 

     } 
    }); 
관련 문제