2017-08-18 27 views
1

這顯示了其中包含列表視圖代碼的其中一個片段,它在其自己的佈局中工作,但在片段中不起作用。我應該怎麼做才能在片段中工作?我對android應用程序開發相當陌生,所以我不知道該怎麼做。如果你不明白我在做什麼,我讓用戶將數據輸入到表單中,然後我希望數據作爲列表顯示在片段中,以便他們可以查看從頭到尾輸入的所有數據。我一直在尋找解決方案,但我無法找到適合我需要的解決方案。我看到的所有信息都是預先保存的sq lite數據庫。當我從用戶獲取數據並將其保存到SQLite數據庫中時,我應該怎麼做才能使listview能夠在片段中工作

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.database.Cursor; 
import android.util.Log; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.widget.Toast; 

import java.util.ArrayList; 

import static android.R.attr.button; 

public class tab3expense extends Fragment { 

    private static final String TAG = "tab3expense"; 
    DatabaseHelper mDatabaseHelper; 
    private ListView mListView; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab3expense, container, false); 
     return rootView; 

     mListView = (ListView) findViewById(R.id.listView); 
     mDatabaseHelper = new DatabaseHelper(this); 

     populateListView(); 

    } 

    private void populateListView() { 
     Log.d(TAG, "populateListView: Displaying data in the ListView."); 

     //get the data and append to a list 
     Cursor data = mDatabaseHelper.getData(); 
     ArrayList<String> listData = new ArrayList<>(); 
     while(data.moveToNext()){ 
      //get the value from the database in column 1 
      //then add it to the ArrayList 
      listData.add(data.getString(1)); 
      listData.add(data.getString(2)); 
      listData.add(data.getString(3)); 
     } 
     //create the list adapter and set the adapter 
     ListAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData); 
     mListView.setAdapter(adapter); 

     //set an onItemClickListener to the ListView 
     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       String name = adapterView.getItemAtPosition(i).toString(); 
       Log.d(TAG, "onItemClick: You Clicked on " + name); 

       Cursor data = mDatabaseHelper.getItemID(name); //get the id associated with that name 
       int itemID = -1; 
       while(data.moveToNext()){ 
        itemID = data.getInt(0); 
       } 
       if(itemID > -1){ 
        Log.d(TAG, "onItemClick: The ID is: " + itemID); 
        Intent editScreenIntent = new Intent(tab3expense.this, add_expense.class); 
        editScreenIntent.putExtra("id",itemID); 
        editScreenIntent.putExtra("name",name); 
        startActivity(editScreenIntent); 
       } 
       else{ 
        toastMessage("No ID associated with that name"); 
       } 
      } 
     }); 
    } 

    /** 
    * customizable toast 
    * @param message 
    */ 
    private void toastMessage(String message){ 
     Toast.makeText(this,message, Toast.LENGTH_SHORT).show(); 
    } 
} 

這裏是佈局文件

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.dharquissandas.budget.MainActivity$PlaceholderFragment"> 

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/listView"/> 
</LinearLayout>  
+0

只是爲了澄清..告訴我你沒有得到任何編譯錯誤後*返回rootView; *在* onCreateView *行? – Raghavendra

+0

我在這一行收到一個錯誤:Intent editScreenIntent = new Intent(tab3expense.this,add_expense.class); –

回答

-1

重新排列代碼

 @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.tab3expense, container, false); 


     mListView = (ListView)rootView. findViewById(R.id.listView); 
     mDatabaseHelper = new DatabaseHelper(getContext()); 

     populateListView(); 
return rootView; 

    } 
0

在片段類上下文將通過以下的方法getActivity()訪問。在這裏,我對你的代碼做了一些改變。您必須在onCreateView()中擴充您的佈局視圖,然後在onActivityCreated()上投射您的列表視圖組件。請看下面的代碼。提前致謝。

public class Tab3expense extends Fragment { 


    private static final String TAG = "tab3expense"; 
    DatabaseHelper mDatabaseHelper; 
    private ListView mListView; 
    View rootView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     rootView = inflater.inflate(R.layout.tab3expense, container, false); 
     return rootView; 



    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     mListView = (ListView) rootView.findViewById(R.id.listView); 
     mDatabaseHelper = new DatabaseHelper(getActivity()); 

     populateListView(); 
    } 

    private void populateListView() { 
     Log.d(TAG, "populateListView: Displaying data in the ListView."); 

     //get the data and append to a list 
     Cursor data = mDatabaseHelper.getData(); 
     ArrayList<String> listData = new ArrayList<>(); 
     while(data.moveToNext()){ 
      //get the value from the database in column 1 
      //then add it to the ArrayList 
      listData.add(data.getString(1)); 
      listData.add(data.getString(2)); 
      listData.add(data.getString(3)); 
     } 
     //create the list adapter and set the adapter 
     ListAdapter adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, listData); 
     mListView.setAdapter(adapter); 

     //set an onItemClickListener to the ListView 
     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       String name = adapterView.getItemAtPosition(i).toString(); 
       Log.d(TAG, "onItemClick: You Clicked on " + name); 

       Cursor data = mDatabaseHelper.getItemID(name); //get the id associated with that name 
       int itemID = -1; 
       while(data.moveToNext()){ 
        itemID = data.getInt(0); 
       } 
       if(itemID > -1){ 
        Log.d(TAG, "onItemClick: The ID is: " + itemID); 
        Intent editScreenIntent = new Intent(getActivity(), add_expense.class); 
        editScreenIntent.putExtra("id",itemID); 
        editScreenIntent.putExtra("name",name); 
        startActivity(editScreenIntent); 
       } 
       else{ 
        toastMessage("No ID associated with that name"); 
       } 
      } 
     }); 
    } 

    /** 
    * customizable toast 
    * @param message 
    */ 
    private void toastMessage(String message){ 
     Toast.makeText(getActivity(),message, Toast.LENGTH_SHORT).show(); 
    } 
} 
+0

謝謝,這個工作,但它不顯示任何新的數據,我從窗體中添加,它只顯示舊數據。有沒有辦法來解決這個問題? –

+0

@DeepHarquissandas您創建了三個數據固定大小的ArrayList,嘗試在動態ArrayList中更改它將有助於顯示新數據。 –

+0

我該怎麼做,我在android編程方面相當新穎,我正在學習如何去做。 –

相關問題