2017-01-10 2 views
1

Ich habe eine Listenansicht, wo Elemente aus der Datenbank kommen. Ich habe versucht, das Bildsymbol für das Listenansichtselement in XML zu setzen. aber es zeigt nicht die Ikone. Ich habe viele Dinge versucht, aber nichts scheint daran zu arbeiten?Bildsymbol wird in Listview Android nicht angezeigt?

Hier ist meine Listview:

public class TypeMenu extends AppCompatActivity { 

    private String TAG = TypeMenu.class.getSimpleName(); 
    String bid; 

    private ProgressDialog pDialog; 
    private ListView lv; 
    private static final String TAG_BID = "bid"; 

    // URL to get contacts JSON 
    private static String url = "http://cloud....com/brtemp/index.php"; 

    ArrayList<HashMap<String, String>> contactList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_type_menu); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 




     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     contactList = new ArrayList<>(); 

     lv = (ListView) findViewById(R.id.list); 

     new GetContacts().execute(); 


     // on seleting single product 
     // launching Edit Product Screen 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

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

       // getting values from selected ListItem 

       HashMap<String, String> selected = contactList.get(position); 
       String selectedId= selected.get("id"); 
       Intent in = new Intent(getApplicationContext(), SubMenu.class); 
       // sending pid to next activity 
       in.putExtra("id",selectedId); 
       startActivityForResult(in, 100); 
       Toast.makeText(getApplicationContext(),"Toast" +selectedId ,Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 

    /** 
    * Async task class to get json by making HTTP call 
    */ 
    private class GetContacts extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(TypeMenu.this); 
      pDialog.setMessage("Please wait..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
      // Toast.makeText(getApplicationContext(),"Toast",Toast.LENGTH_LONG).show(); 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      HttpHandler sh = new HttpHandler(); 

      // Making a request to url and getting response 
     String jsonStr = sh.makeServiceCall(url); 

      Log.e(TAG, "Response from url: " + jsonStr); 





      if (jsonStr != null) { 
       try { 
        JSONArray jsonArry = new JSONArray(jsonStr); 

        for (int i = 0; i < jsonArry.length(); i++) 
        { 

         JSONObject c = jsonArry.getJSONObject(i); 
         String id = c.getString("id"); 
         String type = c.getString("type"); 
         HashMap<String, String> contact = new HashMap<>(); 

         contact.put("id", id); 
         contact.put("type", type); 
         contactList.add(contact); 


        } 
       } catch (final JSONException e) { 
        Log.e(TAG, "Json parsing error: " + e.getMessage()); 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(), 
            "Json parsing error: " + e.getMessage(), 
            Toast.LENGTH_LONG) 
            .show(); 
         } 
        }); 

       } 
      } else { 
       Log.e(TAG, "Couldn't get json from server."); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Couldn't get json from server. Check LogCat for possible errors!", 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 

      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(
        TypeMenu.this, contactList, 
        R.layout.list_item, new String[]{ "type","id"}, 
        new int[]{ 
        R.id.type,R.id.arrow1}); 

      lv.setAdapter(adapter); 
     } 

} 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       onBackPressed(); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
     } 

obigen Code, wenn ich "R.id.Type, R.id.arrow1" setzen dann die Liste lis nicht öffnen und mir Fehler.

hier ist mein Listview.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    > 

    <!-- Product id (pid) - will be DDEN - used to pass to other activity --> 



     <TextView 
      android:id="@+id/id" 
      android:layout_width="30dp" 
      android:layout_height="30dp"/> 

     <TextView 
      android:id="@+id/type" 
      android:textSize="20dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 


    <ImageView 
     android:id="@+id/arrow1" 
     android:layout_width="match_parent" 
     android:layout_height="15dp" 
     android:layout_gravity="center" 
     android:layout_weight="3" 
     android:src="@drawable/dropdown" /> 

    </LinearLayout> 

hier mein logcat ist:

E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.example.zeba.broccoli, PID: 1231 
        android.content.res.Resources$NotFoundException: Resource ID #0x1 
         at android.content.res.Resources.getValue(Resources.java:2452) 
         at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:330) 
         at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:195) 
         at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188) 
         at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100) 
         at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:73) 
         at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:81) 
         at android.widget.SimpleAdapter.setViewImage(SimpleAdapter.java:262) 
         at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:192) 
         at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126) 
         at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114) 
         at android.widget.AbsListView.obtainView(AbsListView.java:2828) 
         at android.widget.ListView.measureHeightOfChildren(ListView.java:1292) 
         at android.widget.ListView.onMeasure(ListView.java:1204) 
         at android.view.View.measure(View.java:18870) 
         at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:728) 
         at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:464) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:703) 
         at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90) 
         at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1367) 
         at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:768) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
         at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435) 
         at android.widget.LinearLayout.measureVertical(LinearLayout.java:721) 
         at android.widget.LinearLayout.onMeasure(LinearLayout.java:612) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1435) 
         at android.widget.LinearLayout.measureVertical(LinearLayout.java:721) 
         at android.widget.LinearLayout.onMeasure(LinearLayout.java:612) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5908) 
         at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3076) 
         at android.view.View.measure(View.java:18870) 
         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2392) 
         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1416) 
         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1661) 
         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1301) 
         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7016) 
         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777) 
         at android.view.Choreographer.doCallbacks(Choreographer.java:590) 
         at android.view.Choreographer.doFrame(Choreographer.java:560) 
        at android.view.Choreographer$FrameDisplayEventRec 
I/Process: Sending signal. PID: 1231 SIG: 9 
Application terminated. 
+0

ist 'R.layout.list_item' und' Listview.xml' gleich. Ich denke, Sie versuchen mit falschem 'Layout' –

+0

welche Bildlader-Bibliothek verwenden Sie? –

+0

ich benutze kein Bild loader es nur Symbol aus xml –

Antwort

1

@ z.al Ich verstehe Ihre Situation, aber um Sie sicher zu machen, SimpleAdapter hilft nur bei der Eingabe von String-Wert in die Textansicht durch ID angegeben.

Aber in Ihrem Fall sollten Sie ein benutzerdefiniertes ArrayAdapter implementieren und in der getView() - Methode können Sie das Bildsymbol auf die imageView setzen.

Es folgt einfach Schnipsel Sie klar zu machen:

public class Person { 

public HashMap<String, String> contact; 
void Person(HashMap<String, String> contact) { 
this.contact = contact; 
} 
} 

public class MyListAdapter extends ArrayAdapter<Person> { 

private Context context; 
private ArrayList<Person> contactList; 

private LayoutInflater mInflater; 
private boolean mNotifyOnChange = true; 

public MyListAdapter(Context context, ArrayList<Person> contactList) { 
    super(context, R.layout.my_row_layout); 
    this.context = context; 
    this.contactList = new ArrayList<>(contactList); 
    this.mInflater = LayoutInflater.from(context); 
} 

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

@Override 
public Person getItem(int position) { 
    return contactList.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) { 
    final ViewHolder holder; 
    if (convertView == null) { 
     holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.my_row_layout,parent, false); 
      holder.name = (TextView) convertView.findViewById(R.id.textview_name); 
      holder.description = (TextView) convertView.findViewById(R.id.textview_description); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

Person person = contactList.get(position); 
    holder.name.setText(person.get("name")); 
    holder.image.setImageResource(person.get("id")); 
    holder.pos = position; 
    return convertView; 
} 

//---------------static views for each row-----------// 
    static class ViewHolder { 

     TextView name; 
     TextView description; 
     ImageView image; 
     int pos; //to store the position of the item within the list 
    } 
} 
+0

aber ich denke, ich muss zu recycleview..coz ich möchte, dass meine App normal mit allen neuesten Modellen läuft ... auf d-Weg thx für die Antwort –

0

Das Problem ist SimpleAdapter für Ihren Anwendungsfall zu einfach ist. Die Dokumentation erklärt, dass es schließlich setViewImage(ImageView, String) aufrufen wird, um das Bild festzulegen; Was es Ihnen nicht sagt ist, dass es erwartet, dass String über Integer.parseInt() in eine ganze Zahl umgewandelt werden soll (leider ist die Dokumentation in dieser Hinsicht nicht sehr gut).

Sie müssen Ihrem Adapter mitteilen, wie Daten an Zeilen in Ihrem ListView gebunden werden. Sie können dies minimal tun, indem Sie eine ViewBinder durch den Aufruf setViewBinder() bereitstellen. Meine Empfehlung ist jedoch, dass Sie eine benutzerdefinierte Adapterimplementierung schreiben, indem Sie BaseAdapter erweitern, da meine Erfahrung darin besteht, dass Benutzer die sehr einfache Verwendung der Framework-Adapter schnell überschreiten.

Als Neben, vielleicht sollten Sie diese Gelegenheit verwenden, um zu RecyclerView seit ListView ist alt und klobig wechseln.

+0

ich habe es nicht versucht ..kann geben Sie diesen Code mit dem ersetzen .. ich neu zu Android –

+1

@ z.al nein, weil ich nichts über Ihren Code weiß. Ich habe Ihnen eine ziemlich klare Richtung gegeben (einschließlich eines einfachen Pfades mit 'setViewBinder()'), es wird von Ihnen erwartet, dass Sie dies in Ihrer Codebasis implementieren. – Karakuri

+0

Kannst du mir einen einfachen Beispiellink geben, damit ich meinen Fehler korrigieren kann? –

Verwandte Themen