2015-08-21 3 views
2

Я новичок в разработке Android, и мне нужно узнать гораздо больше. У меня есть активность, которая использует фрагменты. Открывая основное действие, он показывает 3 фрагмента и с помощью json я создал массив, содержащий ID и имя. Я еще не понял, как помещать данные массива в gridview, а затем как использовать его на фрагменте. Кто-нибудь может мне помочь? Вот мой MainActivityРеакция массива JSon на gridview в фрагменте

public class MainActivity extends AppCompatActivity implements ActionBar.TabListener { 

SectionsPagerAdapter mSectionsPagerAdapter; 
ViewPager mViewPager; 
String myJSON; 
private ProgressDialog pDialog; 



private static final String TAG_RESULTS = "result"; 
private static final String TAG_ID = "ID"; 
private static final String TAG_NAME = "Nome"; 


JSONArray serv_man = null; 
ArrayList<HashMap<String, String>> tableList = new ArrayList<HashMap<String, String>>(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    getData(); 


    // Set up the action bar. 
    final ActionBar actionBar = getSupportActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    // Create the adapter that will return a fragment for each of the three 
    // primary sections of the activity. 
    mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

    // Set up the ViewPager with the sections adapter. 
    mViewPager = (ViewPager) findViewById(R.id.pager); 
    mViewPager.setAdapter(mSectionsPagerAdapter); 

    mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
     @Override 
     public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
     } 
    }); 

    for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {   actionBar.addTab(actionBar.newTab().setText(mSectionsPagerAdapter.getPageTitle(i)).setTabListener(this)); 
    } 
} 
protected void showList(){ 
    try { 
     JSONObject jsonObj = new JSONObject(myJSON); 
     serv_man = jsonObj.getJSONArray(TAG_RESULTS); 

     for(int i=0;i<serv_man.length();i++){ 
      JSONObject c = serv_man.getJSONObject(i); 
      String id = c.getString(TAG_ID); 
      String name = c.getString(TAG_NAME); 

      HashMap<String,String> persons = new HashMap<String,String>(); 

      persons.put(TAG_NAME,name); 
      persons.put(TAG_ID, id); 
      tableList.add(persons); 
     } 

// Здесь я должен создать представление, но я не знаю, как еще

} catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 
public void getData(){ 
    class GetDataJSON extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
      HttpPost httppost = new HttpPost("http://mysite/get_collab.php"); 


      httppost.setHeader("Content-type", "application/json"); 
      InputStream inputStream = null; 
      String result = null; 
      try { 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 

       inputStream = entity.getContent(); 
       // json is UTF-8 by default 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
       StringBuilder sb = new StringBuilder(); 

       String line = null; 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line + "\n"); 
       } 
       result = sb.toString(); 
       Log.d("Log_Tag","xxx" + result); 

// Здесь я могу видеть, что результат хорошо

  } catch (Exception e) { 
       // Oops 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 
      finally { 
       try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
      } 
      return result; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(MainActivity.this); 
      pDialog.setMessage("Obtaining list..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 
     } 


     @Override 
     protected void onPostExecute(String result){ 
      pDialog.dismiss(); 
      myJSON=result; 
      showList(); 
     } 
    } 
    GetDataJSON g = new GetDataJSON(); 
    g.execute(); 
} 


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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
    // When the given tab is selected, switch to the corresponding page in 
    // the ViewPager. 
    mViewPager.setCurrentItem(tab.getPosition()); 
} 

@Override 
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

@Override 
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
} 

public class SectionsPagerAdapter extends FragmentPagerAdapter { 
    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment = null; 
     switch (position) { 
      case 0: 
       fragment = new PpFragment(); 
       break; 
      case 1: 
       fragment = new ScndFragment(); 

       break; 
      case 2: 
       fragment = new thrdFragment(); 

     } 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
     } 
     return null; 
    } 

} 

}

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

ответ

0

Я еще не понял, как поместить свои данные массива в GridView и то, как использовать его на фрагменте.

Чтобы заполнить GridView адаптером для использования данных. Official documantation описывает, какой адаптер следует использовать для GridView, и вы можете найти множество примеров адаптеров в Интернете.

Если вы хотите, чтобы ваша сетка была представлена ​​на фрагменте, а на самой Деятельности, поместите Grid в Fragment, а не в Activity. Это единственное различие.

Для целей обучения советую вам заполнить вид сетки в действии (поместите его в макет xml) и добавить фрагменты позже.

+0

Спасибо за ваш ответ. Я видел официальную документацию, но мне было очень тяжело. В большинстве случаев он более просто смотрит на код и изучает каждую строку, тестирование, изменение и верификацию различий. К сожалению, много раз код, который вы найдете в Интернете, усложняется для новичков. Я учусь, и я очень многому научился! Спасибо за вашу поддержку и извините за мой плохой английский! – Jayelef

0

На мой взгляд, вы можете поместить свое gridview и ваш запрос HTTP в один фрагмент, например PpFragment. И затем вы можете запустить gridview, используя данные, которые вы получаете из Интернета.

Вот GridView адаптер:

Часть1:

private class ImageAdapter extends BaseAdapter{ 
    public ImageAdapter() { 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return tableList.get(position); //tableList is your data source 
    } 

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

    class ViewHolder { 
     TextView name; 
     TextView id; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if(convertView==null){ 
      //layout.item is your item layout of your gridview 
      convertView = getLayoutInflater().inflate(R.layout.item, null); 
      holder = new ViewHolder(); 
      holder.name = (TextView)convertView.findViewById(R.id.name); 
      holder.id = (ImageView)convertView.findViewById(R.id.id); 
      //name and id is your view of your gridview item, for the ID and NAME 

      convertView.setTag(holder); 
     }else{ 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.name.setText(tableList.get(position).get("aaaa")); 
     holder.id.setText(tableList.get(position).get("xxxx")); 
     //Here you can assign values to your TextView with the value you get from the data source. 


     return convertView; 
    } 
} 

Вы можете инициализировать Ваш GridView ниже:

Part2:

//view is your layout of one fragment,such as PpFragment. 
    GridView gridView = (GridView)view.findViewById(R.id.gridviewss); 
    ImageAdapter imageAdapter = new ImageAdapter(); 
    gridView.setAdapter(imageAdapter); 

Элемент GridView расположение XML:

Part3: R.id.gridviewss:

<GridView 
    android:id="@+id/gridviewss" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="3" 
    android:horizontalSpacing="2dp" 
    android:verticalSpacing="7.5dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
    android:background="#F1F1F1" 
    android:paddingLeft="11.5dp" 
    android:paddingRight="11.5dp" 
    android:paddingTop="11.5dp" 
    > 
</GridView> 

Вы можете начать свой запрос HTTP (метод GetData() вы вставили выше) в способе фрагмента, такие как onCreateView вашего фрагмента PpFragment, а затем вы можете инициализировать ваш адаптер с кодом Part2, когда вы получаете данные от хоста (после вызова метода showList()).

Я надеюсь, что это может быть полезно.

Часть4: R.layout.frag_uno_item:

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

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

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/name" 
    /> 
</LinearLayout> 

А потом Fragment_Uno.java:

package com.example.stackproject; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.TextView; 

public class Fragment_Uno extends Fragment { 
String myJSON; 
private ProgressDialog pDialog; 


private static final String TAG_RESULTS = "result"; 
private static final String TAG_ID = "ID"; 
private static final String TAG_NAME = "Nome"; 
JSONArray serv_man = null; 
ArrayList<HashMap<String, String>> tableList = new ArrayList<HashMap<String, String>>(); 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.frag_uno, container, false); 
    getData(); 
    return view; 

} 
protected void showList(){ 
    try { 
     JSONObject jsonObj = new JSONObject(myJSON); 
     serv_man = jsonObj.getJSONArray(TAG_RESULTS); 

     for(int i=0;i<serv_man.length();i++){ 
      JSONObject c = serv_man.getJSONObject(i); 
      String id = c.getString(TAG_ID); 
      String name = c.getString(TAG_NAME); 

      HashMap<String,String> persons = new HashMap<String,String>(); 

      persons.put(TAG_NAME,name); 
      persons.put(TAG_ID, id); 
      tableList.add(persons); 
     } 

     View view = getActivity().getLayoutInflater().inflate(R.layout.frag_uno, null); 
     GridView gridView = (GridView) view.findViewById(R.id.gridView2); 
     ImageAdapter imageAdapter = new ImageAdapter(); 
     gridView.setAdapter(imageAdapter); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 


public void getData(){ 
    class GetDataJSON extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
      HttpPost httppost = new HttpPost("http://etc.collab.php"); 

      // Depends on your web service 
      httppost.setHeader("Content-type", "application/json"); 

      InputStream inputStream = null; 
      String result = null; 
      try { 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 

       inputStream = entity.getContent(); 
       // json is UTF-8 by default 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
       StringBuilder sb = new StringBuilder(); 

       String line = null; 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line + "\n"); 
       } 
       result = sb.toString(); 
       Log.d("Log_Tag", "xxx" + result); 
       //view is your layout of one fragment,such as PpFragment. 


      } catch (Exception e) { 
       // Oops 
       Log.e("log_tag", "Error converting result " + e.toString()); 
      } 
      finally { 
       try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
      } 
      return result; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // pDialog = new ProgressDialog(PpFragment.this); 
      // pDialog.setMessage("Obtaining list..."); 
      // pDialog.setIndeterminate(false); 
      // pDialog.setCancelable(true); 
      // pDialog.show(); 
     } 


     @Override 
     protected void onPostExecute(String result){ 
      //  pDialog.dismiss(); 
      myJSON=result; 
      showList(); 
     } 
    } 
    GetDataJSON g = new GetDataJSON(); 
    g.execute(); 
} 


public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 
    private View layoutInflater; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public ImageAdapter() { 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return tableList.get(position); //tableList is your data source 
    } 

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



    class ViewHolder { 
     TextView name; 
     TextView id; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if (convertView == null) { 
      //layout.item is your item layout of your gridview 
      convertView = getActivity().getLayoutInflater().inflate(R.layout.frag_uno_item, null); 
       holder = new ViewHolder(); 
       holder.name = (TextView)convertView.findViewById(R.id.name); 
       holder.id = (TextView)convertView.findViewById(R.id.id); 
      //name and id is your view of your gridview item, for the ID and NAME 

       convertView.setTag(holder); 
     } else { 
          holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.name.setText(tableList.get(position).get(TAG_NAME)); 
     holder.id.setText(tableList.get(position).get(TAG_ID)); 
     //Here you can assign values to your TextView with the value you get from the data source. 


     return convertView; 
    } 
} 

}

+0

Большое вам спасибо за вашу помощь, я действительно высоко ценю. Я протестировал ваше предложение, внеся изменения, как вы уже писали выше, однако у меня еще есть проблема. В коде вашего адаптера, Android-студия выделяет некоторый код, подобный этому convertView = getLayoutInflater(). Inflate (R.layout.fragment_pp_fragment, null) и скажите, что я не могу решить метод getlayoutinflater, а затем в Ppfragment, в котором я переместил строку json, как вы сказали мне , GridView gridView = (GridView) view.findViewById (R.id.gridview); недействительно, не может разрешить представление строки. Я пытаюсь понять, почему. – Jayelef

+0

В вашем фрагменте вы можете использовать getActivity(). GetLayoutInflater(). Inflate (R.layout.fragment_pp_fragment, null), потому что вы можете просто использовать контекст для вызова getLayoutInflater() mehtod.And view - это представление вашего фрагмента, например view = getActivity(). getLayoutInflater(). inflate (R.layout.fragment_pp_fragment, null); – LinaInverce

+0

Спасибо! Ничего не изменилось! :-) Это нормально, я плохой студент ... если я изменяю с помощью getActivity(), на этот раз это просто красный и компилятор говорит мне, что я не могу разрешить метод и т. Д. – Jayelef

0

Первое изменение этой

public long getItemId(int position) { 
return 0; 

}

Для

public long getItemId(int position) { 
return position; 

}

Затем вам нужно перебирать в хэш-карте. holder.name.setText (tableList.get (position) .get ("aaaa")); holder.id.setText (tableList.get (позиция) .get («хххх»)); `

Отредактировано Вы не нуждаетесь в HashMap для этого забыть .. Просто создать molel класс и создать объект и поглотитель сеттер для него. И установите значения, а затем передайте arrayList своих объектов в адаптер. Пример ниже.

public class DataObject{ 

private boolean success; 
private String message=""; 
private String hash; 
public String getMessage() { 
    return message; 
} 
public void setMessage(String message) { 
    this.message = message; 
} 
public boolean isSuccess() { 
    return success; 
} 
public void setSuccess(boolean success) { 
    this.success = success; 
} 
public String getHash() { 
    return hash; 
} 
public void setHash(String hash) { 
    this.hash = hash; 
} 

}

А потом Когда вы разбор .create объекта и установить Params к нему и добавить его в ArrayList .then передать его к адаптеру .Thats это и Ваш обновленный метод выглядит как

защищен недействительным showList() {

try { 
    JSONObject jsonObj = new JSONObject(myJSON); 
    serv_man = jsonObj.getJSONArray(TAG_RESULTS); 

    for(int i=0;i<serv_man.length();i++){ 
     DataObject dt =new DataObject(); 
     JSONObject c = serv_man.getJSONObject(i); 
     String id = c.getString(TAG_ID); 
     String name = c.getString(TAG_NAME); 
     dt.setName(name); 
     dt.setId(); 
     tableList.add(dt); 
    } 

} catch (JSONException e) { 
    e.printStackTrace(); 
} 

Где tableList=new ArrayList<DataObject>();

определить его в классе уровня и использовать его в своем классе адаптера, чтобы получить text.like это ..

holder.textView.setText(tableList.get(position).getName()); 

Okay Воспрепятствовано меня, если вы сталкиваетесь с любой проблемой

+0

Компилятор отмечен как error holder.name.setText (tableList.get (position) .get ("aaaa")); – Jayelef

+0

И это новый журнал ошибок: D/Log_Tag: xxx {"result": [{"ID": "1", "Nome": "Gianni"}, {"ID": "2", "Nome ":" Michele "}, {" ID ":" 3 "," Nome ":" Margherita "}, {" ID ":" 4 "," Nome ":" Cindy "}]} E/log_tag: Преобразование ошибок result java.lang.NullPointerException – Jayelef

+0

oK Я ИЗМЕНИЛ МОЙ ОТВЕТ. СМОТРИТЕ ABBOBE ... – ADM

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